MYSQL JOIN запрос для группирования пользовательских навыков для условного подсчета - PullRequest
0 голосов
/ 20 февраля 2019

Я изо всех сил пытаюсь найти логику для запроса JOIN с GROUP BY.

У меня есть 3 таблицы.

 1. tbl_users
 2. tbl_event_orders
 3.tbl_event_signature ( For saving signatures on completed events)

tbl_users

id    name     skill
---------------------------
1     user1     A
2     user2     B
3     user3     A
4     user4     A

tbl_orders

id     user_id    item_id    price
------------------------------------
1          1               1                 100
2          2               1                 100
3          3               1                 100
4          4               1                 100

tbl_signature

id     item_id      user_id       signature
----------------------------------------------
1               1                 1                 xxxxxxxx...
1               1                 3                 NULL
1               1                 4                 xxxxxxxx...

Мне нужны подробности события из идентификатора элемента.Например, для предмета с идентификатором 1 мне нужен следующий результат:

skill         total_count     attended_users_count          amount
A                3               2                          300
B                1               0                          100

skill - навык из таблицы пользователя.

total_count - общее количество заказов от этого частичного навыка.

Particip_users_count - общее количество заказов от этого частичного навыка + это должно иметь запись и значение NOT NULL в таблице tbl_signature.

сумма - сумма цены (total_count)

У меня есть следующий запрос для получения пользователей с навыками и общим количеством.

SELECT 
U.skill as skill, 
count(U.skill) as total_count,
sum( O.price ) as amount
FROM  tbl_users U
INNER JOIN  tbl_orders O
ON U.id = O.user_id
WHERE O.item_id = 1
GROUP BY U.skill

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

SELECT 
U.skill as skill, 
count(U.skill) as total_count,
count( S.signature ) as attended_users_count,
sum( O.price ) as amount
FROM  tbl_users U
INNER JOIN  tbl_orders O
ON U.id = O.user_id
LEFT JOIN  tbl_signature S
ON  O.item_id = S.item_id
WHERE O.item_id = 1
GROUP BY U.skill

Есть ли способ получить это в одном запросе?

1 Ответ

0 голосов
/ 20 февраля 2019

Этот запрос должен дать вам результаты, которые вы хотите.Это JOIN с tbl_orders до tbl_users, а затем LEFT JOIN с до tbl_signature.Строки tbl_signature, которые не совпадают или не имеют подписи, не будут включены в счет для этого заказа:

SELECT u.skill,
       COUNT(o.id) AS total_count,
       COUNT(s.signature) AS attended_users_count,
       SUM(o.price) AS amount
FROM tbl_orders o
JOIN tbl_users u ON u.id = o.user_id
LEFT JOIN tbl_signature s ON s.item_id = o.item_id AND s.user_id = u.id
WHERE o.item_id = 1
GROUP BY u.skill

Вывод:

skill   total_count attended_users_count    amount
A       3           2                       300
B       1           0                       100

Демонстрация на dbfiddle

...