Пытаюсь сформировать вывод двумя запросами:
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 написал(а):
Хмм, тут как по мне не хватает основной инфы - остальные комментарии в каком порядке должны выводится? Если в порядке убывания топовости, то все это можно сделать одним запросом:
И в цикле просто отсчитай 3-и итерации, для того, что бы выделить три первых.
Если же остальные коменты должны идти в каком-то другом порядке, то в любом случае подзапрос это наихудшее решение вопроса, т.к. подзапрос выполняется для каждой строки, которую отобрал основной запрос, т.е. если основной запрос отобрал 10 строк, то подзапрос выполнится 10 раз.
В таком случае лучшим вариантом будет при выводе первых 3-х коментов сохранить в массиве их primary идентификаторы, а затем сделать так:
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 написал(а):
Остальные комментарии выводятся в самом обычном порядке,
австраивается по полю id - последние комментарии выводятся первыми...
SELECT * FROM commentarii WHERE statya='$id' ORDER BY id DESC
австраивается по полю id - последние комментарии выводятся первыми...
Спустя 8 часов, 52 минуты, 50 секунд (14.02.2012 - 19:13) vagrand написал(а):
Тогда используй второй вариант