[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Помогите с запросом!
kart
Ребят, помогите, не могу составить запрос! Две таблицы, первая с новостями, вторая с комментариями, нужно вывести список новостей и количество соответствующих им комментариев, типа:
Новость 1 (4 коммента)
Новость 2 (0 комментов)
Новость 3 (1 коммент)
и т.д.
тока отделаться хотелось бы одним запросом... потому как следующая конструкция мне ваще не нравиться (код корявый, но смысл, думаю, понятен):

Код
$result = mysql_query("SELECT id, title FROM `news` LIMIT 0, 20";);
while ($row = mysql_fetch_array($result)) {
    $countRes  = mysql_query("SELECT COUNT(*) FROM `comment` WHERE `newsID` = " .$row['id']);
    while ($cnt = mysql_fetch_array($countRes)) {
        $count = $cnt[0];
    }
    print $row['Title']. " (" .$count. ") <br /> \r\n";
}

в приведенном примере в базу посылается 21 запрос (!), скажите, можно ли оптимизировать? В идеале хочу 1 запрос.



Спустя 52 минуты, 38 секунд (14.06.2007 - 01:48) Ghost написал(а):
SELECT `news`.`title`, COUNT(`comment`.`newsID`) as co FROM `comment` JOIN `news` ON `news`. `id`=`comment`.`newsID` GROUP BY `comment`.`newsID`

Спустя 39 минут, 17 секунд (14.06.2007 - 02:27) kart написал(а):
Ghost, чё-то блин не то ((
Этот запрос вернул мне одну новость и общее кол-во комментариев!

Спустя 6 часов, 36 минут, 18 секунд (14.06.2007 - 09:03) Ghost написал(а):
унриал
у меня вот это

SELECT count( `order`.`id` ) , `user`.`name`
FROM `order`
JOIN `user` ON `order`.`id_manager` = `user`.id
GROUP BY `order`.`id_manager`

отрабатывает отлично.

Посмотри, может со связками там что-то не так. структуры твоих табл я не вижу

Спустя 1 час, 54 минуты, 57 секунд (14.06.2007 - 10:58) kart написал(а):
Ghost, спасибо тебе огромное!!!!!! Направил в нужное русло ))) Я честно говоря сомневался, что такое вообще возможно реализовать!

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

Спустя 24 минуты, 56 секунд (14.06.2007 - 11:23) Ghost написал(а):
попробуй поставить RIGHT JOIN вместо просто JOIN -а

Спустя 4 часа, 38 минут, 39 секунд (14.06.2007 - 16:02) kart написал(а):
мда, Ghost, ты меня сегодня впечатлил... сам бы я до такого ни за что не допёр бы... обязательно теперь куплю себе самую толстую и умную книжку по MySQL ))))

RIGHT JOIN помог частично, он выводит как и в предыдущий раз - те записи, у которых есть комментарии + ещё одна(!) которая без комментариев! То есть вижу я примерно следующие:

news6 - 1
news4 - 0 // возвращается тока с RIGHT JOIN
news3 - 2
news2 - 1
news1 - 3

а в таблице, помимо news4 есть ещё записи, которые не имеют комментов, но они игрорятся!

Спустя 17 минут, 47 секунд (14.06.2007 - 16:20) Ghost написал(а):
открою тебе огромный секрет - помойму книжек по mySQL у меня нет. даже электронных smile.gif
кури мануал smile.gif

ок, давай так попробуем
SELECT `news`.`title`, COUNT(`comment`.`newsID`) as co FROM `news` LEFT JOIN `comment` ON `news`. `id`=`comment`.`newsID` GROUP BY `comment`.`newsID`
если это не сканает есть еще один вариант. но должно сканать

Спустя 12 минут, 23 секунды (14.06.2007 - 16:32) kart написал(а):
Неа, я так пробовал уже ((
Мануал, конечно, сила, я уже целый день его штудирую ))) но до сих пор сам разобраться в своём вопросе не могу... иначе не напрягал бы никого!

Спустя 9 минут, 57 секунд (14.06.2007 - 16:42) kart написал(а):
О!!!!!!!!!!! Заработало!!!!!!!!!!! Слабое место было в строке
GROUP BY `comment`.`newsID`,
исправил на
GROUP BY `news`.`id`
И теперь всё норм!!!!!

Ghost, ещё раз, большое спасибо!!!!!! Выручил... С меня пиво! ))))) wink.gif

Спустя 1 минута, 45 секунд (14.06.2007 - 16:44) Ghost написал(а):
а, да, точно smile.gif группировка. всегда казалось что left и right симметричные smile.gif
наздоровье smile.gif

Спустя 27 минут, 44 секунды (14.06.2007 - 17:12) Секстурист написал(а):
я обычно храню количество комментов при статье, получается +1 запрос при добавлении\удалении коммента, зато не нужно делать сложный запрос при выводе статей.

стоит такой подход использовать или лучше джоины юзать?

Спустя 6 минут, 20 секунд (14.06.2007 - 17:18) Ghost написал(а):
зависит от размеров базы и того как часто тебе нужно выбирать оттуда количество статей

Спустя 9 минут, 57 секунд (14.06.2007 - 17:28) kart написал(а):
Секстурист, я первое время юзал такую же конструкцию как и ты, но пару раз были сбои! Поэтому решил, что лучше уж каждый раз комменты заново пересчитывать... стабильнее.

Спустя 26 минут, 59 секунд (14.06.2007 - 17:55) Ghost написал(а):
не, хранить конечно можно, но нужно обеспечить из админки ф-цию "пересчитать", ну и юзать ее раз в месяц, или кроном
а так по мелочам - никто считать не будет 50 статей, или 53 smile.gif

Спустя 4 дня, 20 часов, 31 минута, 6 секунд (19.06.2007 - 14:26) kart написал(а):
Фааак, так и знал, что не всё так просто...
Короче делаю такой запрос:
Код
"SELECT
    `t1`.`PostID`,
    `t1`.`Date`,
    `t1`.`Title`,
    `t1`.`Content`,
    `t1`.`CategoryID`,
    `t1`.`StatusID`,
    count(`t2`.`PostID`) as count
FROM `news` AS t1
LEFT JOIN `comment` AS t2 ON `t1`.`PostID` = `t2`.`PostID`
GROUP BY `t1`.`PostID` DESC
HAVING `t1`.`StatusID` < 2
LIMIT 0, 20";


Запрос работает нормально, тока при условии, что поле news.Content имеет тип VARCHAR, а если TEXT (а именно такой мне и нужен) выводится ошибка:
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in...
а ответ mysql:
#1 - Can't create/write to file 'c:\tmp\#sql_5d8_0.MYI' (Errcode: 2)

почему так? первый раз вижу чтоб выборка зависела от типа поля...

Спустя 50 минут, 46 секунд (19.06.2007 - 15:17) disc написал(а):
У тебя проблема с виндой может не хватает места или временные файлы ограничены с размером, юзай linux сервера.

Спустя 23 минуты, 18 секунд (19.06.2007 - 15:40) Ghost написал(а):
mysql_query(...) or die(mysql_error())

Спустя 7 часов, 28 минут, 10 секунд (19.06.2007 - 23:08) kart написал(а):
Проблема оказалась в настройке my.ini, там по умолчанию прописан каталог для временных файлов C:/tmp/, который в винде не существует... просто создал его и всё заработало.
При многотабличном запросе mysql создаёт виртуальную таблицу, и сохраняет её во временном файле... теперь я понимаю почему запрос не работал, зато не могу понять, почему же он всё таки работал с полями VARCHAR?


_____________
Быстрый ответ:

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