[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Один запрос вместо множеств
Romms
Есть такой запрос
SELECT * FROM `news`;
Ну и вывод коментов
SELECT * FROM `comments` WHERE `id`='$id_new';

Вывод должен быть типа такого:
  • Новость №1
    • комент №1
    • комент №2
  • Новость №2
    • комент №1
  • Новость №3
    • комент №1
    • комент №2
    • комент №3
    • комент №4
Можна ли сделать так одним запросом? И каким он должен быть?



Спустя 15 минут, 48 секунд (28.03.2010 - 21:05) krasilich написал(а):
Я думаю запросы к двум таблицам можно просто сджоинить по ид статьи.

Спустя 13 минут, 37 секунд (28.03.2010 - 21:18) Romms написал(а):
krasilich, чесно говоря я несильно разбираюсь в джоин, но как я понимаю он тут без силен...

Спустя 41 минута, 33 секунды (28.03.2010 - 22:00) krasilich написал(а):

SELECT * FROM news, comments WHERE comments.news_id = news.id;

Спустя 12 минут, 22 секунды (28.03.2010 - 22:12) Romms написал(а):
ок, припустим... но как мне делать вывод? Ведь тогда, значения новостей будут встречаться много раз...

Спустя 45 минут, 29 секунд (28.03.2010 - 22:58) glock18 написал(а):
join всесилен. иногда даже лишнего, потому что делает через "далеко". но в большинстве подобных ситуаций join даст огромную фору куче запросов.

Спустя 34 минуты, 54 секунды (28.03.2010 - 23:33) krasilich написал(а):
Вот такой вот вариант, но боюсь очень не оптимальный. Если вобще рабочий=)

SELECT * FROM news CROSS JOIN comments ON comments.news_id = news.id;

Спустя 4 минуты, 30 секунд (28.03.2010 - 23:37) glock18 написал(а):
он есть то же самое, что ты выше написал. только написанное более грамотно smile.gif

Спустя 21 час, 38 минут, 22 секунды (29.03.2010 - 21:15) Romms написал(а):
glock18, так напиши как правильно! smile.gif

Спустя 6 минут, 34 секунды (29.03.2010 - 21:22) vagrand написал(а):
SELECT * FROM `news`;
После этого запроса собираеш id всех новостей в массив, например $newsIds, и собираеш запрос:

"SELECT * FROM `comments` WHERE `id`in (" . join(',', $newsIds) . ")"

Таким образом одним запросом ты выбираеш все коменты для отобраных новостей. Далее просто раскидываеш коменты по новостям.

Спустя 34 минуты, 39 секунд (29.03.2010 - 21:57) krasilich написал(а):
vagrand
Сказано же, одним запросом. А тут два на лицо=)

Щас, дочитаю ман по SQL может что-то прояснится=))

Спустя 1 минута, 37 секунд (29.03.2010 - 21:58) Romms написал(а):
krasilich, сылочка есть? =)

Спустя 2 минуты, 39 секунд (29.03.2010 - 22:01) krasilich написал(а):

Спустя 18 минут, 12 секунд (29.03.2010 - 22:19) Romms написал(а):
krasilich, ну-ну))) Это мы уже видели) Пока нет времени читать одновремено переводив на укр) (я уж не так хорошо знаю англ...)

NewBePhp, ок поищу, почитаю

Спустя 5 минут, 10 секунд (29.03.2010 - 22:24) glock18 написал(а):
NewBePhp
ой-ей-ей... а еще можно group_concat и group by with rollup. можно еще как-нибудь извратиться. только стоит ли, если выше предложено два наиболее адекватных варианта?

Спустя 10 часов, 48 минут, 27 секунд (30.03.2010 - 09:13) glock18 написал(а):
Цитата (NewBePhp @ 29.03.2010 - 22:03)
риторический вопрос ИМХО с 2 примерами далеко не уйдешь)))


хм. то есть лучше посмотреть два примера и сделать по-своему через "далеко"?

Спустя 11 минут, 45 секунд (30.03.2010 - 09:25) vagrand написал(а):
krasilich
Цитата
Сказано же, одним запросом. А тут два на лицо=)


Похоже что ты не внимательно читал. Человек спрашивает как избавится от выполнения запроса на выборку коментов для каждой отобраной раньше новости. И я привел наилучший из возможных вариантов, запросы в котором используют только по одной таблице (ибо даже inner join замедляет запрос), запросы будут выполнены быстро, т.к. выборка идет по integer полям, индексы по которым очень шустрые и в результате получаем два массива которые очень легко слепить в один.

Приведи вариант лучше и я признаю шо был неправ.

Спустя 7 минут, 32 секунды (30.03.2010 - 09:32) sergeiss написал(а):
О чем спорим-то? Вот написан запрос
Цитата (krasilich @ 29.03.2010 - 00:33)
SELECT * FROM news CROSS JOIN comments ON comments.news_id = news.id;

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

Спустя 5 минут, 57 секунд (30.03.2010 - 09:38) glock18 написал(а):
vagrand
предпочтение между inner join'ом и вторым запросом должно делаться в зависимости от размеров второй таблицы. если в ней мало записей (3-20), то join будет быстрее. если количество записей заметно больше, то where in будет быстрее.

числа взял навскидку. так же замечу, что join здесь отразится только на потреблении памяти, и медленнее он будет только в том случае, если памяти станет слишком мало.

так что следует все таки выбирать менее категорично. where in может несколько ограничить свободу действий, да и требует дополнительной работы в php.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.