| imho.ws |
![]() |
|
|
|
# 1 |
|
Banned
Регистрация: 16.10.2007
Сообщения: 14
![]() |
Детский вопрос по mysql и php
Форумчане, возник детский вопрос, как правильно запрос формировать, если предположим имеется выбор определённых значений в одном столбике, типа искать SELECT * FROM mytable WHERE My_Nr='100' and My_Nr='200'
вот можно ли это упростить? типа SELECT * FROM mytable WHERE My_Nr='100','200' в общем как правильно сделать? добавлено через 1 минуту PS: просто в запрос надо множество разных значений динамически подставлять, и каждый раз добавлять в запрос and... и название столбца накладновато. То есть там значений таких и под тысячу может выйти.. |
|
|
|
|
# 3 |
|
::VIP::
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
должен заметить, не всегда может помочь, особенно если значений "под тысячи")
например, в Оракле количество элементов в IN ограничено - мы как-то на эти грабли наступили в одном проекте. Тоже запрос строился автоматически, и при некоем пороговом количестве элементов валился. возможно, лучшим решением в данном случае будет воспользоваться временной таблицей, и делать что-то типа SELECT * FROM mytable WHERE My_Nr IN (select ID from TEMP_TABLE) PS: не стану утверждать про другие БД, но с Ораклом точно есть такая особенность
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people. |
|
|
|
|
# 4 |
|
Banned
Регистрация: 09.03.2008
Сообщения: 32
![]() |
BorLase, в моём случае это MySQL, и спасибо большое, я учту. А то, что ты имел ввиду, загонять запрос временно в отдельную таблицу и оттуда зачитывать? Я просто подумал, что если в таком случае несколько человек одновременно будут строить свои запросы, при таком коде ведь они будут друг друга переписывать и мешать друг другу, следовательно, наверное тогда код надо будет делать динамическим, свой ID столбец для каждого запроса!? Я так понимаю, наверняка работающего варианта больше не имеется
|
|
|
|
|
# 5 |
|
::VIP::
Регистрация: 09.09.2002
Адрес: Kiev
Пол: Male
Сообщения: 1 150
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
ну, все не так уж плохо
делаешь таблицу с тремя полями - ID, USERID, DATA - и выбираешь только то, что относится к конкретному юзеру запрос стоишь не цепляя строки в IN, а записывая в темп-таблицу т.е. что-то типа SELECT * FROM mytable WHERE My_Nr IN (select ID from TEMP_TABLE where USERID=###) потом, ессно, после отработки запроса ее чистишь или же, для простоты душевной, создаешь для каждого юзера свою таблицу, потом дропаешь; правда, как это на скорости скажется - не скажу
__________________
Great minds discuss ideas. Average minds discuss events. Small minds discuss people. |
|
|
|
|
# 6 |
|
мод
IMHO Кодер-200(6,7,8) Регистрация: 29.03.2003
Адрес: Saint-Petersburg, Russia
Пол: Male
Сообщения: 2 734
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() |
В MySQL количество в IN ограничено значением max_allowed_packet
http://dev.mysql.com/doc/refman/5.0/...ml#function_in Но если уж пошла об этом речь, о слишком большом перечислении, ведь во временную таблицу данные тоже вставить надо, верно? Значит их количество ограничено длиной всего запроса, видимо ее хватает (да еще и лишний запрос, то есть медленно). Та почему бы в таком случае и выборку не сформировать просто как: IN(...) or IN(...) or IN(...) ? Более того, если же данные не умещаются в один запрос вставки, и вставляются во временну таблицу за несколько приемов и не разумно просто увеличить максимальное их количество, то ведь наверное можно сделать так (не проверял): SELECT .... WHERE ID IN (...many, many values...) UNION ALL SELECT .... WHERE ID IN (...other part of many, many values...) UNION ALL SELECT .... WHERE ID IN (...other part of many, many values...) разве нет?
__________________
Я делаю Линукс! Присоединяйтесь к свободным людям! Связаться со мной всегда можно по джабберу: Hubbitus@jabber.ru Pahan-Hubbitus. |
|
|