2015-03-05 5 views
1

У меня есть 2 стола. 1 для мест проведения, 1 для обзоров. Я пытаюсь, чтобы SQL-запрос запрашивал таблицы и заказывал результаты в зависимости от количества из таблицы отзывов. Он также должен возвращать места, у которых нет отзывов, но они должны быть в конце набора результатов.Заказать по количеству подзапросов

Мой текущий оператор SQL является:

SELECT * , (
    SELECT COUNT(*) AS cnt 
    FROM ratings r 
    WHERE r.venue_id = v.id 
    ORDER BY cnt DESC 
) 
FROM venues AS v 
LEFT JOIN ratings AS r ON r.venue_id = v.id 
WHERE v.active = '1' 
GROUP BY r.venue_id 
LIMIT 20 

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

+0

Если вы хотите, рассмотреть следующую этой простой двухступенчатой ​​курс действий: 1. Если вы еще не сделали этого, , предоставить надлежащие DDL (и/или sqlfiddle), чтобы мы могли легче реплицировать проблему. 2. Если вы еще этого не сделали, укажите желаемый результирующий набор, соответствующий информации, представленной на шаге 1. – Strawberry

ответ

1

Возможно, вам стоит сделать что-то подобное. Надеюсь, я понял, что у меня нет правильного валидатора.

SELECT * 
FROM venues as v LEFT JOIN (
    SELECT COUNT(*) AS cnt, r.venue as ven_id 
    FROM ratings r 
    GROUP BY ven_id 

) as counts 
ON v.id = ven_id 
WHERE v.active = '1' 
ORDER BY cnt DESC 
LIMIT 20 

Главное отличие состоит в том, что я выбираю также идентификатор места встречи вместе с его обзором. Итак, у нас есть упорядоченный подсчет | list_id во внутреннем запросе. Затем вы можете присоединиться к идентификатору места из таблицы мест встречи в ven_id из подзапроса. Я переместил GROUP BY в подзапрос.

+0

@alexsandar - Очень близко, я немного поиграл с вашим кодом и сумел заставить его работать. Вместо 'v.id как ven_id' я помещаю' r.venue_id как ven_id', и он отлично работает – MikeF

+0

@MikeF, Абсолютно, моя ошибка! Я отредактировал его правильно. Я считаю, что вы можете отредактировать его самостоятельно, если есть что-то еще. –

+0

@Alexsandar - Я только что добавил больше оценок к таблице и, похоже, не работает должным образом. В настоящее время существует 3 результата запроса количества в таблице рейтингов. 5,4,1. Тем не менее, он возвращает его в результат 4,5,1 по запросу. – MikeF

2

Если я правильно понял запрос правильно, этот запрос должен быть получен результат, который вы ожидаете:

SELECT v.*, COUNT(*) AS cnt 
FROM venues AS v 
LEFT JOIN ratings AS r ON r.venue_id = v.id 
WHERE v.active = '1' 
GROUP BY r.venue_id 
ORDER BY cnt DESC 
Смежные вопросы