[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: запрос в запросе mysql
DooMka
На странице идёт вывод комментариев пользователей, но в самом её верху будут выведены топовые комментарии, набравшие большее количество плюсов.
Пытаюсь сформировать вывод двумя запросами:

1 - запрос выводит три топовых комментария:

 $ww1 = mysql_query("SELECT * FROM commentarii WHERE statya='$id' ORDER BY golosa_za DESC LIMIT 3",$db);


2 - dj втором запросе стоит задача извлечь все комментарии относящиеся к этой статье, но исключить из них именно те комментарии, что были выведены выше.

 $ww2 = mysql_query("SELECT * FROM commentarii WHERE statya='$id'",$db);


Вопрос, возможно-ли это реализовать с помощью запроса в запросе к mysql? Повторюсь, что речь идёт об одной таблице.

Тот код, что приведён ниже работает неправильно:

$ww1 = mysql_query("SELECT * FROM (SELECT * FROM commentarii WHERE statya='$id' ORDER BY golosa_za DESC LIMIT 3) AS sTable WHERE statya='$id'",$db);


Пытался реализовать это и с помощью такой конструкции:


while ($mn1= mysql_fetch_assoc($ww1))
{


$nn1 = $wp1['id'][0];
$nn2 = $wp1['id'][1];
$nn3 = $wp1['id'][2];
}


отлавливая индификаторы трёх топовых комментариев, и уже исключить их вывод в из общего списка комментариев ниже.
Проблема в получении id комментариев и занесения их в фиксированные переменную, так-как идёт повторный вывод и к переменные будут перезаписываться


while ($mn1= mysql_fetch_assoc($ww1))
{


$nn1 = $wp1['id'];
}


$nn1 будет содержать лишь id последего комментария...

Буду очень признателен за помощь.



Спустя 44 минуты, 32 секунды (14.02.2012 - 06:16) jon378 написал(а):
SELECT * FROM commentarii WHERE statya='$id' ORDER BY golosa_za DESC LIMIT 3


А потом все остальные:

SELECT * FROM commentarii WHERE statya NOT IN (SELECT statya FROM commentarii WHERE statya='$id' ORDER BY golosa_za DESC LIMIT 3)


Не пойдет?

Спустя 5 минут, 42 секунды (14.02.2012 - 06:21) DooMka написал(а):
jon378
Спасибо за ответ, позже попробую, но на данный момент решил эту проблему следующим кодом:

$s4ot4 = 1;

while ()
{
if ($s4ot4 == 1)
{
$top1 = $myr3top['id'];
}
if ($s4ot4 == 2)
{
$top2 = $myr3top['id'];
}
if ($s4ot4 == 3)
{
$top3 = $myr3top['id'];
}
$s4ot4++;
}

Спустя 8 минут, 15 секунд (14.02.2012 - 06:30) TranceIT написал(а):
По правде говоря вариант jon378 выглядит более лаконично и красиво... Чем ваши 10 строк кода...
Хотя фиг его знает что будет работать быстрее при большой нагрузке...

Спустя 3 часа, 19 минут, 33 секунды (14.02.2012 - 09:49) vagrand написал(а):
Хмм, тут как по мне не хватает основной инфы - остальные комментарии в каком порядке должны выводится? Если в порядке убывания топовости, то все это можно сделать одним запросом:

SELECT * FROM commentarii WHERE statya='$id' ORDER BY golosa_za


И в цикле просто отсчитай 3-и итерации, для того, что бы выделить три первых.

Если же остальные коменты должны идти в каком-то другом порядке, то в любом случае подзапрос это наихудшее решение вопроса, т.к. подзапрос выполняется для каждой строки, которую отобрал основной запрос, т.е. если основной запрос отобрал 10 строк, то подзапрос выполнится 10 раз.
В таком случае лучшим вариантом будет при выводе первых 3-х коментов сохранить в массиве их primary идентификаторы, а затем сделать так:

SELECT * FROM commentarii WHERE id not in (' . join(',', $storedIds) . ')

Спустя 30 минут, 39 секунд (14.02.2012 - 10:20) DooMka написал(а):
Остальные комментарии выводятся в самом обычном порядке,

SELECT * FROM commentarii WHERE statya='$id' ORDER BY id DESC


австраивается по полю id - последние комментарии выводятся первыми...

Спустя 8 часов, 52 минуты, 50 секунд (14.02.2012 - 19:13) vagrand написал(а):
Тогда используй второй вариант
Быстрый ответ:

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