Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: MySQL нужна помощь
цитата
17/06/11 в 10:45
 amazon
Есть две таблицы:
`db`.`t1` и `db`.`t2`
`db`.`t1` содержит поля `id`(primary) и `status`
`db`.`t2` содержит поля `t1_id` и `data`
Надо выбрать из `db`.`t2` значения полей `data` где `t1_id` = `id` со `status` = 2 из таблицы `db`.`t1`
Можно ли это сделать одним запросом к базе?
Если можно, то как он будет выглядеть?
Не хотелось бы создавать смежную таблицу для этого, но запрос составить - тоже ничего на ум не пришло icon_sad.gif
Помогите плз.
цитата
17/06/11 в 10:57
 Еugene
Код:
select t2.data from t1,t2 where t1.id=t2.t1_id and t1.status=2;


или

Код:
select t2.data from t1 join t2 on (t2.t1_id = t1.id) WHERE t1.status=2;


оба запроса должны работать
цитата
17/06/11 в 11:04
 FXIX
лучше первый. эквисоединение это называется
цитата
17/06/11 в 12:08
 amazon
Спасибо за помощь.
Кстати, вспомнил, составлял уже когда-то нечто подобное, забыл просто icon_sad.gif
цитата
23/06/11 в 22:56
 PvCont
При оптимизации сайта, а в частности запросов к базе такой способ гораздо более ресурсозатратней чем 2 простых запроса к двум таблицам. Ну по крайней мере времени затрачивается больше icon_confused.gif
цитата
24/06/11 в 03:31
 idk2045
FXIX писал:
лучше первый. эквисоединение это называется

хм первый насколько я помню максимально долго работает просматривая все комбинации всех строк двух таблиц.
вообще это типичная задача для left join запросов, как уже верно писали

Код:
select t2.data from t1 left join t2 on (t2.t1_id = t1.id) WHERE t1.status=2;


а ну и конечно t2.t1_id должен быть индексом
цитата
24/06/11 в 12:03
 FXIX
ну спорить не буду. два запроса это два соединения с мускуль-сервером. со всеми вытекающими расходами на коннект.
соединение строк двух таблиц на основе одиного ключа - штука чрезвычайно быстрая. вся таблица не просматривается. сразу из двух столбцов выбраются соразмерные значения и строки двух таблиц склеиваются. как там оно реализовано (без промежуточной таблицы? созданием heap\merge\temporary-таблицы? я не помню. надо ман смотреть), но в любом случае быстрее чем два запроса, и потом с этим руками что-то вручную мутить уже в пхп.
ну кому как. я предпочитаю составить запрос, пусть на 10 строк, да хоть на 20. только ради того чтобы все повесить на сторону мускуля и не ебаться с этим в пхп руками.

и кстати оба запроса аналогичны вроде. "внутри"
цитата
24/06/11 в 12:24
 Flyman
PvCont писал:
При оптимизации сайта, а в частности запросов к базе такой способ гораздо более ресурсозатратней чем 2 простых запроса к двум таблицам. Ну по крайней мере времени затрачивается больше icon_confused.gif


Как раз наоборот. 1 запрос меньше ресурсозатратней чем два. Это и называется оптимизация запросов. А еще меньше времени на запрос когда индексы есть.
цитата
24/06/11 в 16:09
 PvCont
Я то же не буду спорить Но выявил это опытным путем. Просто добавил в код скрипт считающий время выполнения запросов и вот что получилось.
А про индексы вообще речи не веду Я говорю про абсолютно одинаковые условия при выполнении запросов.
Можете сами проверить...
цитата
24/06/11 в 18:24
 Flyman


Если база Mysql небольшая то такое может быть. А если записей сотни тысяч, тогда будет результат другим. Ну и конечно смотря какие записи и запросы к базе. А то может говорим о разном.
цитата
24/06/11 в 18:33
 PvCont
Ну.. У меня была не большая.. Может и так
цитата
24/06/11 в 19:51
 Dr.Syshalt
PvCont писал:

А про индексы вообще речи не веду


А надо бы. Что Flyman говорит - касается нормализованных баз. Там однозначно один запрос, со всеми JOIN'ами будет быстрее аналогично работающих N запросов. А так - можно сделать базу через одно место так, что на ней получатся какие угодно результаты, но только выводы будут не те, что с запросами проблема и надо их разбивать на несколько, а что база сделана через жопу. Просто многие относятся к базе так, что это типа большая свалка, в которую можно валить данные как попадет, типа экселя, ноутпада или что-то в этом духе. А там все гораздо сложнее, и правильно базу составить - это уже искусство.


Эта страница в полной версии