Почему наличие двух левых соединений приводит к дополнительным значениям? - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь объединить три таблицы, одна из которых связана с другой, которая связана с другой, показывая все строки одной из таблиц, USERS. Затем я подсчитываю, сколько TCKID от TICKET и TCKID от SEQUENCE у каждого пользователя. Таблицы связаны следующим образом: ПОЛЬЗОВАТЕЛИ <- БИЛЕТ <- ПОСЛЕДОВАТЕЛЬНОСТЬ </p>

По какой-то причине, когда мой запрос выполняется, «выданные заявки» на первые три строки равны 2 вместо 1, что происходит после добавления моего второй левый присоединиться Это почему?

USERS
+-------+-----------------------+
| USRID |         Name          |
+-------+-----------------------+
|     1 | Lula Wiley            |
|     2 | Isabell Horn          |
|     3 | Usman Hook            |
|     4 | Abdullah Singleton    |
+-------+-----------------------+

TICKET
+-------+-------+
| TCKID | USRID |
+-------+-------+
|     1 |     1 |
|     2 |     2 |
|     3 |     7 |
|     4 |    14 |
|     5 |    14 |
|     6 |     6 |
|     7 |     3 |
|     8 |     9 |
+-------+-------+

SEQUENCE
+-------+
| TCKID |
+-------+
|     1 |
|     1 |
|     2 |
|     2 |
|     3 |
|     4 |
|     5 |
|     6 |
|     6 |
|     7 |
|     7 |
|     8 |
+-------+

Вот что показывает моя таблица при запуске:

+-----------------------+----------------+---------------+
|         Name          | Tickets Issued | Total Flights |
+-----------------------+----------------+---------------+
| Lula Wiley            |              2 |             2 |
| Isabell Horn          |              2 |             2 |
| Usman Hook            |              2 |             2 |
| Abdullah Singleton    |              0 |             0 |
+-----------------------+----------------+---------------+

Вот мой код

SELECT
    U.Name,
    COUNT(T.USRID) AS 'Tickets Issued',
    COUNT(S.TCKID) AS 'Total Flights'
FROM
    Users U
LEFT JOIN ticket T
    ON U.USRID = T.USRID
LEFT JOIN sequence S        -- Changes Tickets issued 
    ON T.TCKID = S.TCKID
GROUP BY U.Name, U.Phone, T.USRID, U.USRID

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Ваша проблема в том, что когда вы JOIN sequence до ticket, вы создаете строку в наборе результатов для каждой строки в sequence. Это приводит к дублированию USRID значений в ticket (попробуйте использовать только SELECT *, и вы увидите это), что приводит к двойному (или более) подсчету значения Tickets Issued. Вы можете обойти это, считая различные TCKID в ticket вместо:

SELECT
    U.Name,
    COUNT(DISTINCT T.TCKID) AS 'Tickets Issued',
    COUNT(S.TCKID) AS 'Total Flights'
FROM
    Users U
LEFT JOIN ticket T
    ON U.USRID = T.USRID
LEFT JOIN sequence S        -- Changes Tickets issued 
    ON T.TCKID = S.TCKID
GROUP BY U.Name, U.USRID
ORDER BY U.USRID

Вывод:

Name                Tickets Issued  Total Flights
Lula Wiley          1               2
Isabell Horn        1               2
Usman Hook          1               2
Abdullah Singleton  0               0

Демо на dbfiddle

0 голосов
/ 23 апреля 2020

Попробуйте это

SELECT
    U.Name,
    COUNT(T.USRID) AS 'Tickets Issued',
    (
        SELECT COUNT(*)
        FROM sequence S
        WHERE S.TCKID = T.TCKID
    ) AS 'Total Flights'
FROM
    Users U
LEFT JOIN ticket T
    ON U.USRID = T.USRID
GROUP BY U.Name, U.Phone, T.USRID

или

SELECT
    U.Name,
    COUNT(T.USRID) AS 'Tickets Issued',
    T_TOTAL_FLIGHT.total_flights AS 'Total Flights'
FROM
    Users U
LEFT JOIN ticket T
    ON U.USRID = T.USRID
LEFT JOIN (
    SELECT TCKID, COUNT(*) AS total_flights
    FROM sequence
    GROUP BY TCKID
) T_TOTAL_FLIGHT ON T.TCKID = T_TOTAL_FLIGHT.TCKID
GROUP BY U.Name, U.Phone, T.USRID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...