Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Помогите с MySQL запросом пожалуйста

52K
30 октября 2010 года
lexandr
26 / / 16.07.2010
В базе в таблице pages хранятся страницы сайта. Каждая страница находиться в нескольких категориях на сайте, имеет столбец category
записаны они в нем в таком виде

catid,catid,catid,catid,catid,catid
то есть например
1,5,12,10

Как выбрать из таблицы все страницы с категорией только 5 например?
Страницы:
244
30 октября 2010 года
UAS
2.0K / / 19.07.2006
Такого говнокода я ещё не встречал. Почитайте в мане про mysql про WHERE
52K
30 октября 2010 года
lexandr
26 / / 16.07.2010
К сожалению такой говно-код в DLE CMS.
Where вы имеете ввиду LIKE?
15
30 октября 2010 года
shaelf
2.7K / / 04.05.2005
LIKE не поможет. Если выбирать по цифре, то будет много лишних совпадений (по LIKE %1% выдаст так же 10, 11, 12 и т.д.), если тянуть по %1,% то в раздачу не попадёт последняя, если "," будет в самом начале, то не попадёт в поиск первая цифра. На сколько я помню, MySQL поддерживает регулярки, можно капнуть в их сторону.
52K
30 октября 2010 года
lexandr
26 / / 16.07.2010
Про Like уже сам понял что не поможет. Я же новичек ткните туда где можно почитать. В Dle же идет как то выборка по отдельным категорям, но я не нашел а скорее всего просто не понял как там =)
15
30 октября 2010 года
shaelf
2.7K / / 04.05.2005
Помочь найти доки по MySQL?
52K
30 октября 2010 года
lexandr
26 / / 16.07.2010
mysql.ru, либо я слепой либо чайник, решения я так и не нашел. Не серьезно отсылать к мануалам когда решение нужно прямо сейчас, я не экзамен сдаю) Ткните носом в раздел или дайте готовое пожалуйста.
15
31 октября 2010 года
shaelf
2.7K / / 04.05.2005
Не серьёзно думать, что кто-то чем-то кому-то обязан. Если прям сейчас и готовое, то раздел "работа" ниже.
2
31 октября 2010 года
squirL
5.6K / / 13.08.2003
Цитата: lexandr
mysql.ru, либо я слепой либо чайник, решения я так и не нашел..


а почему не сделать на стороне кода двумя простыми запросами? если уж база спроектирована по кретински?

3.6K
01 ноября 2010 года
CrazyTimon
125 / / 13.02.2006
я так и не понял
 
Код:
select `pages` from `table` where 'catid'=5
не работает?Если не работает, то почему?
274
01 ноября 2010 года
Lone Wolf
1.3K / / 26.11.2006
Цитата: CrazyTimon
я так и не понял
 
Код:
select `pages` from `table` where 'catid'=5
не работает?Если не работает, то почему?



Чукча не читатель? Чукча писатель?

В первом посте все четко написано....
catid строка в формате '1,2,5,76' и так далее...

1.9K
01 ноября 2010 года
Werky
129 / / 14.01.2006
Если есть хоть какая то возможность вынести данные о категориях в отдельную таблицу то лучше сделайте, иначе с ростом к-ва записей запросы будут выполняться очень медленно.
396
01 ноября 2010 года
SibBear
223 / / 27.07.2006
я неправильно понял, или по первому посту page может находиться сразу в 4х категориях?
а если я хочу, чтобы она была в 10, 20 категориях? что в таблицу добавлять каждый раз дополнительное поле?
сделайте таблицу нормальную и все
pages_table
id (int autoinc)
title (varchar)
text (text)
enabled (tinyint)

parent_table
id (int autoinc)
page_id
cat_id

получите таблицу parent вида
1 1 5
2 1 7
3 1 9
4 2 2
5 2 5

все. Теперь из parent_table выбирайте все page_id у которых cat_id=5, потом по этим page_id выбирайте сами новости.
JOIN вам в помошь...
244
01 ноября 2010 года
UAS
2.0K / / 19.07.2006
SibBear, как бэ тогда в parent_table id не нужен. Это лишнее.

Таблицу переделать сложно, т.к. это DLE (как тут сказали).
Из возможных вариантов вижу только использование регулярных выражений вместо LIKE.
396
01 ноября 2010 года
SibBear
223 / / 27.07.2006
Цитата: UAS
SibBear, как бэ тогда в parent_table id не нужен. Это лишнее.


ну да, привычка :)

1
01 ноября 2010 года
kot_
7.3K / / 20.01.2000
Цитата: UAS

Таблицу переделать сложно, т.к. это DLE (как тут сказали).
Из возможных вариантов вижу только использование регулярных выражений вместо LIKE.


почему? разве за переделку чего либо в БД DLE теперь убивают? Или не позволяет религия?
ИМХО самый верный способ - для своей задачи создать свою таблицу(-цы) и работать с ней.

244
01 ноября 2010 года
UAS
2.0K / / 19.07.2006
Цитата: kot_
почему? разве за переделку чего либо в БД DLE теперь убивают? Или не позволяет религия?


Не, я тут имел в виду, что для дле существует достаточное кол-во модов, которые подстроены под этот изврат с catid. Естественно, если переносить все в отдельную таблицу, то прийдется и все модули сторонние дописывать.
С другой стороны - можно подправить скрипт создания статей, чтобы он дублировал данные в две таблицы, что самое оптимальное.
Если же статей планируется немного, то можно остановиться и на текущем варианте.

1
01 ноября 2010 года
kot_
7.3K / / 20.01.2000
Цитата: UAS
Не, я тут имел в виду, что для дле существует достаточное кол-во модов, которые подстроены под этот изврат с catid. Естественно, если переносить все в отдельную таблицу, то прийдется и все модули сторонние дописывать.
С другой стороны - можно подправить скрипт создания статей, чтобы он дублировал данные в две таблицы, что самое оптимальное.
Если же статей планируется немного, то можно остановиться и на текущем варианте.


я как раз таки и имел ввиду - если необходимо изменить функционал движка (либо внести изменения) - то лучше это сделать отдельными таблицами - не затрагивая существующую БД. Подобный подход позволит сохранить функциональность для сторонних модов, и в тоже время нарастить эту функциональность так как надо. Как говорят - и рыбку съесть и на елку влезть.

396
20 ноября 2010 года
SibBear
223 / / 27.07.2006
Хелп!
Есть таблица
id, name, enabled
выводится список, в котором если enabled=1 стоит чеквокс вкл.
Чтобы обновить значения всех чекбоксов при сохранении я делаю:
 
Код:
db_query("UPDATE table SET enabled='0'");
        foreach ($_POST as $key => $value)
          if (strstr($key, "enable_") != false)
          {
            $key = str_replace("enable_","",$key);
            if (!strcmp($value, "on")) $is_enable = 1;
            else $is_enable = 0;
            db_query("UPDATE table SET enabled='".$is_enable."' WHERE id='".(int)$key."'") or die (db_error());
          }

Итого: 100 нажатых чекбоксов - 100 запросов к базе! жуть...
как сформировать запрос правлильно?
244
20 ноября 2010 года
UAS
2.0K / / 19.07.2006
WHERE id IN (1,2,3,4,100500,etc...)

P.S.: кстати, а что у всех привычка использовать этот or die(...)? Это же образец говнокодища (правда, не слишком низкосортного) + нарушение в какой-то степени безопасности скрипта.
Давно пора уже все засунуть в классы, которые будут все обрабатывать + выкидывать эксепшены.
396
20 ноября 2010 года
SibBear
223 / / 27.07.2006
Цитата: UAS
WHERE id IN (1,2,3,4,100500,etc...)



Спасибо, чето туплю под вечер... причем сильно...

396
20 ноября 2010 года
SibBear
223 / / 27.07.2006
А не существует какого нибудь варианта как
UPDATE tabel (id, name) VALUES (2, 'name1), (3, 'name2')...
если обновить нужно много данных в нескольких таблицах по ключу id ?
1
20 ноября 2010 года
kot_
7.3K / / 20.01.2000
 
Код:
UPDATE table SET name1 = 2, name2 = 3 ... WHERE id = :id
396
22 ноября 2010 года
SibBear
223 / / 27.07.2006
не совсем понял логику такого запроса...
это как то называется хитро? чтоб почитать подробнее можно было...
1
22 ноября 2010 года
kot_
7.3K / / 20.01.2000
Цитата: SibBear
не совсем понял логику такого запроса...
это как то называется хитро? чтоб почитать подробнее можно было...


что значит - не совсем понял логику запроса? значение полей устанавливаются в тех строках, где выполняется условие.

369
22 ноября 2010 года
Kesano
451 / / 09.10.2007
А я не парился...
Значения категорий выделял так:
|54||36||23||67||32|

И потом банальный:
select * from table_name where (category LIKE '%|54|%' AND category LIKE '%|67|%')

Отлично работает и для базы с максимум 10к записей - то что нужно! ))
И совпадений по цифрам "ненужных" не найдет...
396
22 ноября 2010 года
SibBear
223 / / 27.07.2006
Цитата: kot_
значение полей устанавливаются в тех строках, где выполняется условие.



А какое условие?

таблица
id, name, some_ect, more_ect...

нужно обновить в соответствии (id, name, some_ect) values (1, "name1", "ect1"), (2, "name2", "ect2")

нет же полей name1, name2?

сожет тогда inserd on duplicate использовать?

1
22 ноября 2010 года
kot_
7.3K / / 20.01.2000
тогда
 
Код:
insert into таблица values (1, "name1", "ect1");
insert into таблица values (2, "name2", "ect2");
...

чем не устраивает?
либо
 
Код:
insert into таблица(id, name, some_ect...) (select id, name, some_ect... from другая_таблица where ...);
...

не возможно "вставьте то, сам не знаю что".
396
22 ноября 2010 года
SibBear
223 / / 27.07.2006
Я решил остановиться на варианте
 
Код:
INSERT INTO table (id, name, ect) VALUES (1, "name1", "ect1"),...,(N, "nameN", "ectN") ON DUPLICATE KEY UPDATE name=VALUES(name), ect=VALUES(ect)


но я же не могу чтоб все так просто...
Если у меня 1000 строк, то это спасает от 1000 запросов в цикле,
НО! длина такого запроса получится огогенной...
мускуль не вздернется от такого счастья?
1
22 ноября 2010 года
kot_
7.3K / / 20.01.2000
а в чем смысл?
396
22 ноября 2010 года
SibBear
223 / / 27.07.2006
вы меня извините, но в чем смысл таких ответов?

У меня таблица в 10000 строк, чтобы не обновлять ее в цикле строя 10000 запросов я формирую в цикле только часть VALUES(), почле выхода из цикла выполняю Один! запрос
insert into table (id, name...) VALUES $sql_from_circle ON DUPLICALE....

я и спрашиваю, не повеситься мускуль от запроса в 10000 Values ?
1
22 ноября 2010 года
kot_
7.3K / / 20.01.2000
существует хорошая традиция - люди предлагающие странные идеи - как правило сами на себе их и проверяют.
Возникает вопрос - что тут странного? Казалось бы - то ли, 10000 запросов, толи один но 10000 строк.
1. Модель данных. Если модель данных предполагает атомарные вставки/обновления 10000 записей - то (это ИМХО) в любом случае необходимо как минимум понимать - какая из записей не вставилась/не обновилась. Как это будет в случае одного запроса?
2. С моей точки зрения - Incert и Update разные операции - мешать их в одну кучу - это клоака.
3...
поэтому если тебе задают вопрос - а нахера - то как правило это не спроста. Возможно это признак того, что твое решение гениально. Но как правило - скорее наоборот. ИМХО формировать многометровые запросы без особой на то нужды - это признак либо желания всех наипать, либо глубокого непрофессионализма.
Смысл таких ответов надеюсь понятен? Т.е. если действительно существует задача, которую стоит решать таким способом - мне было бы интересно о этом узнать. А если ты один из 95% населения - то мне в принципе это все равно. Но для того, что бы это выяснить - существует простой тест - спросить человека - "а нахера это все?".
63
22 ноября 2010 года
Zorkus
2.6K / / 04.11.2006
Оффтор - кстати, соединение update and insert (aka merge) бывает крайне полезным в задачах интеграции. Скажем, когда у тебя в базе хранится информация, и раз в день приходит файл, содержащий апдейт для этой информации (некоторого подмножества строк, условно говоря).
15
22 ноября 2010 года
shaelf
2.7K / / 04.05.2005
Цитата: Kesano
А я не парился...
Значения категорий выделял так:
|54||36||23||67||32|

И потом банальный:
select * from table_name where (category LIKE '%|54|%' AND category LIKE '%|67|%')

Отлично работает и для базы с максимум 10к записей - то что нужно! ))
И совпадений по цифрам "ненужных" не найдет...



LIKE (а тем более %text%) это самый страшный сон MySQL ))

2Zorkus +1. Так же бывает полезно в всяких там ORM, чтобы не писать на апдейт и инсерт разные методы)) Меньше кода = меньше ошибок )

1
23 ноября 2010 года
kot_
7.3K / / 20.01.2000
Цитата: shaelf

Так же бывает полезно в всяких там ORM, чтобы не писать на апдейт и инсерт разные методы)) Меньше кода = меньше ошибок )


ИМХО искать в строке из 200-300 символов ошибку - не слишком легко.
Искать ошибку в строке, которая то ли апдейтит толи инсертит +10000 записей - это надо быть очень трудолюбивым идиотом. ИМХО. :)
без крайней нужды я лично бы подобное делать не стал бы.
Тут же вопрос не в написании разных операций на апдейт/инсерт - использовать ли одну операцию и для вставки и для записи - это больше вопрос предпочтений.
А вот зачем объединять операции над всеми строками набора в один запрос?

396
23 ноября 2010 года
SibBear
223 / / 27.07.2006
Подведем итоги:

При формировании одного запроса на 10000 записей мускуль проглатывает (через phpMyAdmin), но через php система просто виснет, выкидывает из за превышения времени и вообще ничего не понятно...
При формировании апдейта в цикле создавая 10000 запросов к базе она работает долго, но по крайней мере не виснит, и как вариант можно прикрутить прогресс-бар, чтобы пользователь не офигел от ожидания... И так же при каждом обращении можно записать результат в лог...

Всем спасибо! для себя вывод сделал...

P.S. зачем мучить LIKE если есть IN () я тоже не понял...
244
23 ноября 2010 года
UAS
2.0K / / 19.07.2006
%) Автор, что мешает сделать сделать 10 больших запросов по 1000 записей в каждом или меньше? Ищи золотую середину, а не крайности, что ты ща и делаешь.
13
23 ноября 2010 года
RussianSpy
3.0K / / 04.07.2006
Здесь как ни выкручивайся - все равно говнокод получается. Структура заведомо неверна.
15
23 ноября 2010 года
shaelf
2.7K / / 04.05.2005
Цитата: kot_
ИМХО искать в строке из 200-300 символов ошибку - не слишком легко.
Искать ошибку в строке, которая то ли апдейтит толи инсертит +10000 записей - это надо быть очень трудолюбивым идиотом. ИМХО. :)
без крайней нужды я лично бы подобное делать не стал бы.
Тут же вопрос не в написании разных операций на апдейт/инсерт - использовать ли одну операцию и для вставки и для записи - это больше вопрос предпочтений.
А вот зачем объединять операции над всеми строками набора в один запрос?



Всё зависит от того, как написать :) Если не в одну строчку всё писать, то нормально.

396
23 ноября 2010 года
SibBear
223 / / 27.07.2006
Цитата: RussianSpy
Здесь как ни выкручивайся - все равно говнокод получается. Структура заведомо неверна.



Ну а каким еще образом обнавлять таблицу из тысячей записей? тут вариантов то не так много, хоть там и обновляется только 2 колонки, и не чаще, скорее всего, чем раз в месяц, но строк уйма и их надо как то обновлять.

13
24 ноября 2010 года
RussianSpy
3.0K / / 04.07.2006
Цитата: SibBear
Ну а каким еще образом обнавлять таблицу из тысячей записей? тут вариантов то не так много, хоть там и обновляется только 2 колонки, и не чаще, скорее всего, чем раз в месяц, но строк уйма и их надо как то обновлять.



Так и обновлять как все обновляют.

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог