Новость 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";
}
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`
отрабатывает отлично.
Посмотри, может со связками там что-то не так. структуры твоих табл я не вижу
у меня вот это
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 есть ещё записи, которые не имеют комментов, но они игрорятся!
RIGHT JOIN помог частично, он выводит как и в предыдущий раз - те записи, у которых есть комментарии + ещё одна(!) которая без комментариев! То есть вижу я примерно следующие:
news6 - 1
news4 - 0 // возвращается тока с RIGHT JOIN
news3 - 2
news2 - 1
news1 - 3
а в таблице, помимо news4 есть ещё записи, которые не имеют комментов, но они игрорятся!
Спустя 17 минут, 47 секунд (14.06.2007 - 16:20) Ghost написал(а):
открою тебе огромный секрет - помойму книжек по mySQL у меня нет. даже электронных 
кури мануал
ок, давай так попробуем
SELECT `news`.`title`, COUNT(`comment`.`newsID`) as co FROM `news` LEFT JOIN `comment` ON `news`. `id`=`comment`.`newsID` GROUP BY `comment`.`newsID`
если это не сканает есть еще один вариант. но должно сканать

кури мануал

ок, давай так попробуем
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, ещё раз, большое спасибо!!!!!! Выручил... С меня пиво! )))))
GROUP BY `comment`.`newsID`,
исправил на
GROUP BY `news`.`id`
И теперь всё норм!!!!!
Ghost, ещё раз, большое спасибо!!!!!! Выручил... С меня пиво! )))))

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


наздоровье

Спустя 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
а так по мелочам - никто считать не будет 50 статей, или 53

Спустя 4 дня, 20 часов, 31 минута, 6 секунд (19.06.2007 - 14:26) kart написал(а):
Фааак, так и знал, что не всё так просто...
Короче делаю такой запрос:
Запрос работает нормально, тока при условии, что поле 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)
почему так? первый раз вижу чтоб выборка зависела от типа поля...
Короче делаю такой запрос:
Код
"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";
`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?
При многотабличном запросе mysql создаёт виртуальную таблицу, и сохраняет её во временном файле... теперь я понимаю почему запрос не работал, зато не могу понять, почему же он всё таки работал с полями VARCHAR?
_____________