Подсчет отдельных записей из дочерней таблицы для каждого пользователя в MYSQL

0

У меня есть соревнование, в котором подсчитывается количество видов, собранных каждым пользователем. это управляется тремя таблицами:

  1. родительскую таблицу под названием "sub" с коллекцией, каждая коллекция уникальна, имеет идентификатор и связана с идентификатором пользователя.
    
    +----+---------+
    | id | user_id |
    +----+---------+
    |  1 |       1 |
    |  2 |      10 |
    |  3 |       1 |
    |  4 |       3 |
    |  5 |       1 |
    |  6 |      10 |
    +----+---------+
    
  2. дочерняя таблица под названием "sub_items" содержит несколько уникальных записей спецификаций и связана с родительской таблицей с помощью поддиректа к id. (каждый суб может иметь несколько записей спецификаций)

+----+--------+---------+--+
| id | sub_id | spec_id |  |
+----+--------+---------+--+
|  1 |      1 |    1000 |  |
|  2 |      1 |    1003 |  |
|  3 |      1 |    2520 |  |
|  4 |      2 |    7600 |  |
|  5 |      2 |    1000 |  |
|  6 |      3 |      15 |  |
+----+--------+---------+--+
  1. таблица пользователя с соответствующим user_id

+--------+-------+--+
| usename | name    |
+---------+-------+--+
|      1 | David    |
|     10 | Ruth     |
|      3 | Rick     |
+--------+-------+--+

Мне нужно перечислить пользователей с самыми уникальными спецификациями, собранными в заказе. ожидаемый результат: у Дэвида всего 2 уникальных specs.Ruth имеет в общей сложности 2 уникальных спецификации.



+--------+---------+
| id     | total   |
+----+-------------+
|  David |    2    |
|  Ruth  |    2    |
|  Rick  |    2    |
+----+-------------+

пока у меня это есть, он дает результат. но его неточно, он подсчитывает общие записи. im, вероятно, отсутствует DISTINCT где-то в подзапросе.

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
 

Я рассмотрел это решение, но он не рассматривает уникальный аспект

Теги:
distinct

2 ответа

1
Лучший ответ

Сначала вам нужно получить максимальный "счет" для всех пользователей:

    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
    )
  • 0
    Спасибо ! Я не уверен, что вы поняли, что мне нужно, могу понять, что вы имели в виду под «Макс. счетом». то, что я хотел, это общий балл, упорядоченный от высшего к низшему
  • 1
    В этом случае вы можете просто удалить это предложение HAVING и все добавить его и заменить на ORDER BY total desc . Здесь нет необходимости в подзапросе.
Показать ещё 1 комментарий
0

это сработало для меня, я должен добавить

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
 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню