IMHO.WS

IMHO.WS (http://www.imho.ws/index.php)
-   Веб-программирование (http://www.imho.ws/forumdisplay.php?f=29)
-   -   Детский вопрос по mysql и php (http://www.imho.ws/showthread.php?t=130303)

Viroman 08.03.2008 12:37

Детский вопрос по mysql и php
 
Форумчане, возник детский вопрос, как правильно запрос формировать, если предположим имеется выбор определённых значений в одном столбике, типа искать SELECT * FROM mytable WHERE My_Nr='100' and My_Nr='200'
вот можно ли это упростить?
типа SELECT * FROM mytable WHERE My_Nr='100','200'
в общем как правильно сделать?

добавлено через 1 минуту
PS: просто в запрос надо множество разных значений динамически подставлять, и каждый раз добавлять в запрос and... и название столбца накладновато. То есть там значений таких и под тысячу может выйти..

RaZEr 08.03.2008 12:46

WHERE column IN(1,2,3,4,5)

BorLase 12.03.2008 00:50

Цитата:

Сообщение от RaZEr (Сообщение 1530404)
WHERE column IN(1,2,3,4,5)

должен заметить, не всегда может помочь, особенно если значений "под тысячи")

например, в Оракле количество элементов в IN ограничено - мы как-то на эти грабли наступили в одном проекте. Тоже запрос строился автоматически, и при некоем пороговом количестве элементов валился.

возможно, лучшим решением в данном случае будет воспользоваться временной таблицей, и делать что-то типа

SELECT * FROM mytable WHERE My_Nr IN (select ID from TEMP_TABLE)

PS: не стану утверждать про другие БД, но с Ораклом точно есть такая особенность

Viromаn 12.03.2008 12:35

BorLase, в моём случае это MySQL, и спасибо большое, я учту. А то, что ты имел ввиду, загонять запрос временно в отдельную таблицу и оттуда зачитывать? Я просто подумал, что если в таком случае несколько человек одновременно будут строить свои запросы, при таком коде ведь они будут друг друга переписывать и мешать друг другу, следовательно, наверное тогда код надо будет делать динамическим, свой ID столбец для каждого запроса!? Я так понимаю, наверняка работающего варианта больше не имеется :(

BorLase 12.03.2008 13:11

ну, все не так уж плохо
делаешь таблицу с тремя полями - ID, USERID, DATA - и выбираешь только то, что относится к конкретному юзеру

запрос стоишь не цепляя строки в IN, а записывая в темп-таблицу

т.е. что-то типа
SELECT * FROM mytable WHERE My_Nr IN (select ID from TEMP_TABLE where USERID=###)

потом, ессно, после отработки запроса ее чистишь

или же, для простоты душевной, создаешь для каждого юзера свою таблицу, потом дропаешь; правда, как это на скорости скажется - не скажу

Hubbitus 13.03.2008 03:22

В 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.