2015-03-05 8 views
-2

Я хочу получить список сообщений, отсортированных по количеству комментариев, я успешно выполнил следующий запрос, но он дает повторяющиеся значения, т.е. сообщения повторяются, я хочу, чтобы их уникальная сортировка по количеству комментарии, когда я помещаю DISTINCT() вокруг всего моего запроса, появляется ошибка: # 1064 - У вас есть ошибка в синтаксисе SQL; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом с «UNIQUE (post.pname, post.pid FROM Оставлять комментарии WHERE post.pid = comment.pid ORD» в строке 1mysql DISTINCT() не работает должным образом

Запрос без DISTINCT() (работ, но, конечно, не дают уникальных значений)

SELECT post.pname, post.pid 
FROM post, 
COMMENT WHERE post.pid = comment.pid 
ORDER BY (

SELECT COUNT(*) 
FROM COMMENT WHERE comment.pid = post.pid 
GROUP BY post.pname 
) 

запросов с DISTINCT() (не работает)

SELECT DISTINCT(post.pname, post.pid 
FROM post, 
COMMENT WHERE post.pid = comment.pid 
ORDER BY (

SELECT COUNT(*) 
FROM COMMENT WHERE comment.pid = post.pid 
GROUP BY post.pname 
)) 
+1

Вы имеете в виду DISTINCT, а не UNIQUE? –

+0

Уникальный предназначен для добавления ограничений, тогда как для выбора уникальных строк используется отдельный. – Maxqueue

+0

Прошу прощения, DISTINCT тоже не работает – user3597009

ответ

0
SELECT distinct(post.pname) FROM post,COMMENT WHERE post.pid = comment.pid ORDER BY (SELECT COUNT(*) FROM COMMENT WHERE comment.pid = post.pid GROUP BY post.pname) DESC 
-2
SELECT p.* 
FROM post p JOIN comment c ON c.postId = p.id 
GROUP BY p.id 
ORDER BY COUNT(*) 
+0

Это не обязательно будет работать «правильно». Поскольку GROUP BY не перечисляет все поля, код может выбирать случайные значения для вещей, отличных от p.id. –

+0

этот запрос работает с mysql, который является СУБД, используемым для этого вопроса ... – Javaluca

1

DISTINCT следует использовать следующим образом:

SELECT DISTINCT a,b,c FROM t; 

без GROUP BY. Он найдет все таблицы (a, b, c) в таблице, а затем удалит их.

Это сломана:

SELECT id, a, b FROM t GROUP BY id; 

Это потому, что он найдет все различные значения идентификатора, но поставить случайные значения a и b идти с каждым.

Чтобы узнать, сколько каждый foo есть, эта модель хорошо работает:

SELECT foo, COUNT(*) FROM t GROUP BY foo; 

Не используйте() после DISTINCT.

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

0
SELECT post.pname, post.pid 
FROM post 
    Inner Join (Select 
         comment.pid 
        , COUNT(*) As Cant 
       From COMMENT 
       Group By 
         comment.pid 
       ) As x 
     On post.pid = x.pid 
ORDER BY x.Cant 
Смежные вопросы