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

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

  1. родительская таблица с названием «sub» с коллекцией, каждая коллекция уникальна, имеет идентификатор и связана с идентификатором пользователя.
    
    +----+---------+
    | id | user_id |
    +----+---------+
    |  1 |       1 |
    |  2 |      10 |
    |  3 |       1 |
    |  4 |       3 |
    |  5 |       1 |
    |  6 |      10 |
    +----+---------+
    
  2. дочерняя таблица с именем «sub_items» содержит несколько уникальных записей спецификаций и связана с родительской таблицей по идентификатору sub 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 уникальных специализации, у Рут - 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
 

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

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
187
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

    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
    )

Благодарность ! Я не уверен, понимаете ли вы, что мне нужно, мог бы понять, что вы имели в виду под «максимальным счетом». то, что я хотел, это общий балл, упорядоченный от самого высокого до самого низкого.

buzibuzi 26.09.2018 19:27

В этом случае вы можете просто удалить этот пункт HAVING, добавить его и заменить на ORDER BY total desc. Здесь нет необходимости в подзапросе.

JNevill 26.09.2018 21:19

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

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
 

Другие вопросы по теме