Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Связь между 2 таблицами ТОВАРОВ и ЗАКАЗОВ
 
 автор: ntro123   (16.01.2014 в 13:21)   письмо автору
 
 

Добрый день, у меня существует 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 заказа, а для всех, чтобы выводил сразу всё?

  Ответить  
 
 автор: Valick   (16.01.2014 в 15:52)   письмо автору
 
   для: ntro123   (16.01.2014 в 13:21)
 

вместо id= попробуй id IN

  Ответить  
 
 автор: Enter   (16.01.2014 в 16:03)   письмо автору
 
   для: ntro123   (16.01.2014 в 13:21)
 

Используйте джоины. Вложенные запросы работают более медленно.

  Ответить  
 
 автор: Sfinks   (16.01.2014 в 16:21)   письмо автору
 
   для: Enter   (16.01.2014 в 16:03)
 

не придумывайте.

  Ответить  
 
 автор: psychomc   (16.01.2014 в 18:23)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Sfinks   (16.01.2014 в 23:29)   письмо автору
 
   для: psychomc   (16.01.2014 в 18:23)
 

Оптимизатор из возможных решений в большинстве случаев сам приведет запрос к оптимальному. По крайней мере в EXPLAIN разницы не будет.
Наоборот, часто бывает, что при JOIN уже использован какой-то индекс. А при создании подзапроса можно задействовать еще один....
Т.е. в эксплэйн вместо одного запроса без использования индекса и со сканированием 100 000 строк будет два, но в каждом по 50.
В простейшем же случае разницы не будет.
В общем очень многое зависит от схемы БД.
________
Статью еще не смотрел.... Завтра обязательно гляну.

  Ответить  
 
 автор: psychomc   (17.01.2014 в 00:35)   письмо автору
 
   для: 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

  Ответить  
 
 автор: Enter   (16.01.2014 в 18:58)   письмо автору
 
   для: Sfinks   (16.01.2014 в 16:21)
 

хорошо))

  Ответить  
 
 автор: ntro123   (16.01.2014 в 16:26)   письмо автору
 
   для: 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


работает, всем спасибо. Производительность роли не играет, отправляю такой запрос раз в месяц, данных не много.

  Ответить  
 
 автор: Valick   (16.01.2014 в 17:37)   письмо автору
 
   для: ntro123   (16.01.2014 в 16:26)
 

с джоином понтовее :)

  Ответить  
 
 автор: ntro123   (16.01.2014 в 18:57)   письмо автору
 
   для: Valick   (16.01.2014 в 17:37)
 

Если не сложно, покажите пример.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования