2016-08-19 4 views
1

У меня есть две таблицы пользователи и голосов и некоторые пользователи могут иметь тот же unq_idGROUP BY с использованием другой таблицы

Я пытаюсь выбрать все отличиеunq_id от пользователей и сортировать их по votes от голосов таблица.

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

enter image description here

SELECT DISTINCT u.unq_id, COUNT(v.id) AS count_votes 
FROM users u 
INNER JOIN votes v 
ON u.unq_id = v.unq_id 
WHERE u.unq_id <> '' 
GROUP BY u.unq_id; 

SQLFiddle: http://sqlfiddle.com/#!9/e0bb35/1

Ожидаемые результаты:

3fyx6 - 3 
9kx9mq - 1 
+0

Общее GROUP BY правило гласит: Если GROUP BY пункте указано, каждая ссылка на столбец в списке SELECT, должны либо определить столбец группировки или быть аргументом функции набора! – jarlh

+0

Ваше отношение к таблице выглядит странно. У вас должен быть уникальный идентификатор для присоединения к которому у вас нет в настоящее время. Это не сработает. –

+0

Обычно нет необходимости делать SELECT DISTINCT, когда GROUP BY. – jarlh

ответ

2

Для получения желаемого результата вам не нужно, чтобы присоединиться к users, но на основе вашего комментария «у некоторых пользователей нет голосов, и я хочу разместить их в списке», следует агрегировать до LEFT JOIN:

SELECT DISTINCT 
    u.unq_id, 
    COALESCE(v.count_votes, 0) 
FROM users u 
LEFT JOIN 
(select unq_id, count(*) as count_votes 
    from votes 
    group by unq_id 
) v 
ON u.unq_id = v.unq_id 
WHERE u.unq_id <> ''; 
3

Попробуйте изменить

SELECT DISTINCT u.unq_id, COUNT(v.id) AS count_votes 

в

SELECT DISTINCT u.unq_id, COUNT(distinct v.id) AS count_votes 

И посмотреть, если это помогает :)

+0

, похоже, работает –

+0

И если вы хотите включить пользователей без каких-либо зарегистрированных голосов, я бы переключился с внутреннего соединения на левое соединение :) – Moptan

+0

Проблема с дубликатами - это природа объединений при объединении двух таблиц с дублированными данными в обоих соединенных столбцах – Moptan

1

Это будет работать:

select distinct v.unq_id, count(distinct v.id) as votes 
from users u 
inner join votes v 
on u.unq_id = v.unq_id 
group by v.unq_id 
order by 2 desc; 

Но я предпочел бы использовать подзапрос, я думаю, что было бы гораздо быстрее:

select v.unq_id, count(v.unq_id) as votes 
from votes v 
where v.unq_id in (select unq_id from users group by unq_id) 
group by v.unq_id 
order by 2 desc; 
Смежные вопросы