![]() |
Детский вопрос по mysql и php
Форумчане, возник детский вопрос, как правильно запрос формировать, если предположим имеется выбор определённых значений в одном столбике, типа искать SELECT * FROM mytable WHERE My_Nr='100' and My_Nr='200'
вот можно ли это упростить? типа SELECT * FROM mytable WHERE My_Nr='100','200' в общем как правильно сделать? добавлено через 1 минуту PS: просто в запрос надо множество разных значений динамически подставлять, и каждый раз добавлять в запрос and... и название столбца накладновато. То есть там значений таких и под тысячу может выйти.. |
WHERE column IN(1,2,3,4,5)
|
Цитата:
например, в Оракле количество элементов в IN ограничено - мы как-то на эти грабли наступили в одном проекте. Тоже запрос строился автоматически, и при некоем пороговом количестве элементов валился. возможно, лучшим решением в данном случае будет воспользоваться временной таблицей, и делать что-то типа SELECT * FROM mytable WHERE My_Nr IN (select ID from TEMP_TABLE) PS: не стану утверждать про другие БД, но с Ораклом точно есть такая особенность |
BorLase, в моём случае это MySQL, и спасибо большое, я учту. А то, что ты имел ввиду, загонять запрос временно в отдельную таблицу и оттуда зачитывать? Я просто подумал, что если в таком случае несколько человек одновременно будут строить свои запросы, при таком коде ведь они будут друг друга переписывать и мешать друг другу, следовательно, наверное тогда код надо будет делать динамическим, свой ID столбец для каждого запроса!? Я так понимаю, наверняка работающего варианта больше не имеется :(
|
ну, все не так уж плохо
делаешь таблицу с тремя полями - ID, USERID, DATA - и выбираешь только то, что относится к конкретному юзеру запрос стоишь не цепляя строки в IN, а записывая в темп-таблицу т.е. что-то типа SELECT * FROM mytable WHERE My_Nr IN (select ID from TEMP_TABLE where USERID=###) потом, ессно, после отработки запроса ее чистишь или же, для простоты душевной, создаешь для каждого юзера свою таблицу, потом дропаешь; правда, как это на скорости скажется - не скажу |
В 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...) разве нет? |
| Часовой пояс GMT +4, время: 21:41. |
Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.