|
|
|
| Добрый день, у меня существует 2 таблицы, товары и клиенты, делаю такой запрос:
SELECT * FROM `orders` WHERE id=(SELECT idz FROM tov WHERE idt=96 ORDER BY idz DESC) AND date >= '2014-01-01' ORDER BY id DESC LIMIT 1000
|
Говорит "#1242 - Subquery returns more than 1 row"
Делаю такой же но с лимитом 1 в скобках:
SELECT * FROM `orders` WHERE id=(SELECT idz FROM tov WHERE idt=96 ORDER BY idz DESC LIMIT 1) AND date >= '2014-01-01' ORDER BY id DESC LIMIT 1000
|
Возвращает все что нужно, как сделать тоже самое, но не для 1 заказа, а для всех, чтобы выводил сразу всё? | |
|
|
|
|
|
|
|
для: ntro123
(16.01.2014 в 13:21)
| | вместо id= попробуй id IN | |
|
|
|
|
|
|
|
для: ntro123
(16.01.2014 в 13:21)
| | Используйте джоины. Вложенные запросы работают более медленно. | |
|
|
|
|
|
|
|
для: Enter
(16.01.2014 в 16:03)
| | не придумывайте. | |
|
|
|
|
|
|
|
для: Sfinks
(16.01.2014 в 16:21)
| | скорее всего он прав http://stackoverflow.com/questions/2577174/join-vs-sub-query
In most cases JOINs are faster than sub-queries and it is very rare for a sub-query to be faster.
Historically, explicit joins usually win, hence the established wisdom that joins are better | |
|
|
|
|
|
|
|
для: psychomc
(16.01.2014 в 18:23)
| | Оптимизатор из возможных решений в большинстве случаев сам приведет запрос к оптимальному. По крайней мере в EXPLAIN разницы не будет.
Наоборот, часто бывает, что при JOIN уже использован какой-то индекс. А при создании подзапроса можно задействовать еще один....
Т.е. в эксплэйн вместо одного запроса без использования индекса и со сканированием 100 000 строк будет два, но в каждом по 50.
В простейшем же случае разницы не будет.
В общем очень многое зависит от схемы БД.
________
Статью еще не смотрел.... Завтра обязательно гляну. | |
|
|
|
|
|
|
|
для: Sfinks
(16.01.2014 в 23:29)
| | всё возможно, я не спец. в mysql. возможно, самым правильным было бы взять пару реальных баз и провести замеры на разных запросах. хотя, я доверяю stackoverflow, это достаточно авторитетный ресурс
кстати, вот что нашел по поводу индексов
Дальше в условии WHERE есть вложенный запрос, который выполняется в условии IN. Если указать в этом условии статические значения, например IN(8,16,32), то MySQL использовал бы индексы и отработал бы быстро. Со вложенными запросами дела гораздо хуже. MySQL выполняет их без использования индексов, а точнее так: FIND_IN_SET(article_id, '8,16,32'). Вот в таких случаях лучше писать запрос отдельно и его результат уже потом подставлять в IN.
http://best-web-creation.com/articles/view/id/soveti-po-optimizatsii-mysql-zaprosov
и вот здесь советуют оптимизировать вложенные запросы через join
http://sqlinfo.ru/forum/viewtopic.php?id=2113
и здесь
http://itif.ru/mysql-optimizaciya-vlozhennyx-zaprosov-vida-in-select/
http://www.litecode.ru/mysql/responses_optimization.shtml | |
|
|
|
|
|
|
|
для: Sfinks
(16.01.2014 в 16:21)
| | хорошо)) | |
|
|
|
|
|
|
|
для: ntro123
(16.01.2014 в 13:21)
| |
SELECT * FROM `orders` WHERE id IN (SELECT idz FROM tov WHERE idt=96 OR idt=1 ORDER BY idz DESC) AND date >= '2014-01-01' ORDER BY id DESC LIMIT 1000
|
работает, всем спасибо. Производительность роли не играет, отправляю такой запрос раз в месяц, данных не много. | |
|
|
|
|
|
|
|
для: ntro123
(16.01.2014 в 16:26)
| | с джоином понтовее :) | |
|
|
|
|
|
|
|
для: Valick
(16.01.2014 в 17:37)
| | Если не сложно, покажите пример. | |
|
|
|