Нераспределенный ион
С нами с 04.11.04
Сообщения: 736
Рейтинг: 475
|
Добавлено: 17/06/11 в 10:45 |
Есть две таблицы:
`db`.`t1` и `db`.`t2`
`db`.`t1` содержит поля `id`(primary) и `status`
`db`.`t2` содержит поля `t1_id` и `data`
Надо выбрать из `db`.`t2` значения полей `data` где `t1_id` = `id` со `status` = 2 из таблицы `db`.`t1`
Можно ли это сделать одним запросом к базе?
Если можно, то как он будет выглядеть?
Не хотелось бы создавать смежную таблицу для этого, но запрос составить - тоже ничего на ум не пришло
Помогите плз.
|
|
|
|
С нами с 10.12.03
Сообщения: 1615
Рейтинг: 870
|
Добавлено: 17/06/11 в 10:57 |
Код: | 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; |
оба запроса должны работать
|
|
|
|
Добрых Дел Мастер
С нами с 03.05.08
Сообщения: 3143
Рейтинг: 1227
|
Добавлено: 17/06/11 в 11:04 |
лучше первый. эквисоединение это называется
|
|
пришел к победе коммунистического труда
|
5
|
|
|
Нераспределенный ион
С нами с 04.11.04
Сообщения: 736
Рейтинг: 475
|
Добавлено: 17/06/11 в 12:08 |
Спасибо за помощь.
Кстати, вспомнил, составлял уже когда-то нечто подобное, забыл просто
|
|
|
|
С нами с 23.06.11
Сообщения: 41
Рейтинг: 7
|
Добавлено: 23/06/11 в 22:56 |
При оптимизации сайта, а в частности запросов к базе такой способ гораздо более ресурсозатратней чем 2 простых запроса к двум таблицам. Ну по крайней мере времени затрачивается больше
|
|
...тут и сказочке Esc, кто не понял F1)
|
0
|
|
|
С нами с 27.09.03
Сообщения: 5454
Рейтинг: 2506
|
Добавлено: 24/06/11 в 03:31 |
FXIX писал: | лучше первый. эквисоединение это называется |
хм первый насколько я помню максимально долго работает просматривая все комбинации всех строк двух таблиц.
вообще это типичная задача для left join запросов, как уже верно писали
Код: | select t2.data from t1 left join t2 on (t2.t1_id = t1.id) WHERE t1.status=2; |
а ну и конечно t2.t1_id должен быть индексом
|
|
|
|
Добрых Дел Мастер
С нами с 03.05.08
Сообщения: 3143
Рейтинг: 1227
|
Добавлено: 24/06/11 в 12:03 |
ну спорить не буду. два запроса это два соединения с мускуль-сервером. со всеми вытекающими расходами на коннект.
соединение строк двух таблиц на основе одиного ключа - штука чрезвычайно быстрая. вся таблица не просматривается. сразу из двух столбцов выбраются соразмерные значения и строки двух таблиц склеиваются. как там оно реализовано (без промежуточной таблицы? созданием heap\merge\temporary-таблицы? я не помню. надо ман смотреть), но в любом случае быстрее чем два запроса, и потом с этим руками что-то вручную мутить уже в пхп.
ну кому как. я предпочитаю составить запрос, пусть на 10 строк, да хоть на 20. только ради того чтобы все повесить на сторону мускуля и не ебаться с этим в пхп руками.
и кстати оба запроса аналогичны вроде. "внутри"
|
|
пришел к победе коммунистического труда
|
0
|
|
|
С нами с 01.06.11
Сообщения: 96
Рейтинг: 4
|
Добавлено: 24/06/11 в 12:24 |
PvCont писал: | При оптимизации сайта, а в частности запросов к базе такой способ гораздо более ресурсозатратней чем 2 простых запроса к двум таблицам. Ну по крайней мере времени затрачивается больше |
Как раз наоборот. 1 запрос меньше ресурсозатратней чем два. Это и называется оптимизация запросов. А еще меньше времени на запрос когда индексы есть.
|
|
|
|
С нами с 23.06.11
Сообщения: 41
Рейтинг: 7
|
Добавлено: 24/06/11 в 16:09 |
Я то же не буду спорить Но выявил это опытным путем. Просто добавил в код скрипт считающий время выполнения запросов и вот что получилось.
А про индексы вообще речи не веду Я говорю про абсолютно одинаковые условия при выполнении запросов.
Можете сами проверить...
|
|
|
|
С нами с 01.06.11
Сообщения: 96
Рейтинг: 4
|
Добавлено: 24/06/11 в 18:24 |
Если база Mysql небольшая то такое может быть. А если записей сотни тысяч, тогда будет результат другим. Ну и конечно смотря какие записи и запросы к базе. А то может говорим о разном.
|
|
|
|
С нами с 23.06.11
Сообщения: 41
Рейтинг: 7
|
Добавлено: 24/06/11 в 18:33 |
Ну.. У меня была не большая.. Может и так
|
|
...тут и сказочке Esc, кто не понял F1)
|
-1
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 24/06/11 в 19:51 |
PvCont писал: |
А про индексы вообще речи не веду |
А надо бы. Что Flyman говорит - касается нормализованных баз. Там однозначно один запрос, со всеми JOIN'ами будет быстрее аналогично работающих N запросов. А так - можно сделать базу через одно место так, что на ней получатся какие угодно результаты, но только выводы будут не те, что с запросами проблема и надо их разбивать на несколько, а что база сделана через жопу. Просто многие относятся к базе так, что это типа большая свалка, в которую можно валить данные как попадет, типа экселя, ноутпада или что-то в этом духе. А там все гораздо сложнее, и правильно базу составить - это уже искусство.
|
|
|
|