Сортировка вывода данных из одной таблицы, исходя из ссылок на эту таблицу в другой таблице.

программирование MySQL базы данных

Доброго дня. Мучаюсь несколько дней с задачей, простой на первый взгляд, но никак у меня не решаемой.
Есть таблица в базе MySQL - PHOTO - в ней содержатся директории отображаемых на сайте фотографий. Есть вторая таблица COMMENT - в ней содержатся комментарии к фотографиям первой таблицы. Задача вывести фото отсортировав по количеству комментариев, т.е. первые должны выводиться фотографии, к которым больше всего комментариев и по нисходящей.

Вот структура таблицы PHOTO:
id_photo - dir_photo

Вот структура COMMENT:
id_comment - id_photo - comment

, где id_photo в таблице COMMENT==уникальному идентификатору id_photo в таблице PHOTO.

Информация должна выводиться только из таблицы PHOTO, но сортировка с учетом имеющихся комментариев в таблице COMMENT.

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

Примечание:
PetSerAl - спасибо за быстрый ответ. К сожалению выводит все-равно неверно. Не знаю в чем может быть причина, но вывод неправильный.

Примечание:
hedint - можно пример?

Примечание:
hedint - выдает тот же результат, что и пример PetSerAl, только дольше обрабатывается запрос в несколько раз. В любом случае спасибо, буду думать.

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

Примечание:
PetSerAl - да, у меня небольшая таблица комментариев, и там ошибиться сложно.. как бы в случайном порядке просеялись фото без комментов в общем выводе. Ума не приложу в чем может быть причина. Буду разбираться. Спасибо.
Ответы:
select PHOTO.*
from
   PHOTO left join
   COMMENT on COMMENT.id_photo=PHOTO.id_photo
group by PHOTO.id_photo
order by count(COMMENT.id_comment) desc
Логично, потому что агрегатные функции (SUM, COUNT) в части ORDER BY работать не могут.
Вам нужно вынести эту часть в сам запрос, сделать ее именованной (AS) и по ней сделать ORDER BY
Я бы сделал примерно так, но у меня нет под рукой ничего, чтобы проверить правильность и синтаксис.
SELECT `PHOTO`.*, (SELECT COUNT(`COMMENT`.`id_comment`) FROM `COMMENT` WHERE `COMMENT`.`id_photo`=`PHOTO`.`id_photo`) AS `cnt` FROM `PHOTO` ORDER BY `cnt` DESC;
Исходя из каких данных Вы решили, что результат запроса неверный? Может привести тестовый набор данных, на котором бы этот неправильный результат достигался?
А Вы уверенны, что у тех фотографий действительно нет комментариев? И эти фотографии действительно между, а не в конце? Запрос
select * from COMMENT where id_photo=...
Возвращает пустое множество для таких фотографий?
Да, по поводу своего замечания в отношении варианта PetSerAl извиняюсь, был введен в заблуждение, вариант отличный. :)
Можете показать результат такого запроса, а также указать в каком порядке выводит результаты мой первый запрос?
select
   PHOTO.id_photo,
   COMMENT.id_comment
from
   PHOTO left join
   COMMENT on COMMENT.id_photo=PHOTO.id_photo


11 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.