У меня есть соревнование, в котором подсчитывается, сколько видов собрал каждый пользователь. это управляется 3 таблицами:
+----+---------+
| id | user_id |
+----+---------+
| 1 | 1 |
| 2 | 10 |
| 3 | 1 |
| 4 | 3 |
| 5 | 1 |
| 6 | 10 |
+----+---------+
+----+--------+---------+--+
| id | sub_id | spec_id | |
+----+--------+---------+--+
| 1 | 1 | 1000 | |
| 2 | 1 | 1003 | |
| 3 | 1 | 2520 | |
| 4 | 2 | 7600 | |
| 5 | 2 | 1000 | |
| 6 | 3 | 15 | |
+----+--------+---------+--++--------+-------+--+
| usename | name |
+---------+-------+--+
| 1 | David |
| 10 | Ruth |
| 3 | Rick |
+--------+-------+--+Мне нужно перечислить пользователей с наиболее уникальными характеристиками, собранными в порядке убывания. ожидаемый результат: Всего у Дэвида 2 уникальных специализации, у Рут - 2 уникальных специализации.
+--------+---------+
| id | total |
+----+-------------+
| David | 2 |
| Ruth | 2 |
| Rick | 2 |
+----+-------------+
so far i have this,it produces a result. but its not accurate, it counts the total records.
im probably missing a DISTINCT somewhere in the sub-query.
SELECT s.id, s.user_id,u.name, sum(t.count) as total
FROM sub s
LEFT JOIN (
SELECT id, sub_id, count(id) as count FROM sub_items GROUP BY sub_id
) t ON t.sub_id = s.id
LEFT JOIN user u ON u.username = s.user_id
GROUP BY user_id
ORDER BY total DESC
я посмотрел на решение это, но оно не учитывает уникальный аспект






Сначала вам нужно будет набрать максимальный балл для всех пользователей, например:
SELECT count(DISTINCT si.id) as total
FROM sub INNER JOIN sub_items si ON sub.id = su.sub_id
GROUP BY sub.user_id
ORDER BY total DESC
LIMIT 1
Затем вы можете использовать это, чтобы ограничить свой запрос пользователями, которые имеют этот максимальный балл:
SELECT u.name, count(DISTINCT si.id) as total
FROM
user u
INNER JOIN sub ON u.usename = sub.user_id
INNER JOIN sub_items si ON sub.id = su.sub_id
GROUP BY u.name
HAVING total =
(
SELECT count(DISTINCT si.id) as total
FROM sub INNER JOIN sub_items si ON sub.id = su.sub_id
GROUP BY sub.user_id
ORDER BY total DESC
LIMIT 1
)
В этом случае вы можете просто удалить этот пункт HAVING, добавить его и заменить на ORDER BY total desc. Здесь нет необходимости в подзапросе.
это сработало для меня, я должен добавить
COUNT(distinct spec_id)
к подзапросу
SELECT s.id, s.user_id,u.name, sum(t.count) as total
FROM sub s
LEFT JOIN (
SELECT sub_id, COUNT(distinct spec_id) as count FROM sub_items group by sub_id
) t ON t.sub_id = s.id
LEFT JOIN user u ON u.username = s.user_id
GROUP BY user_id
ORDER BY total DESC
Благодарность ! Я не уверен, понимаете ли вы, что мне нужно, мог бы понять, что вы имели в виду под «максимальным счетом». то, что я хотел, это общий балл, упорядоченный от самого высокого до самого низкого.