Как присоединиться из 3 таблицы с условием - PullRequest
0 голосов
/ 09 февраля 2019

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

Tabel person :               Tabel hobby :            Tabel referensi :

-----------------      ------------------    -------------------------------------
|  id  |  name  |      |  id  |  hobby  |    |  id  |  ref_person  |  ref_hobby  |
-----------------      ------------------    -------------------------------------
|   1  |  Rose  |      |   1  |  Makan  |    |   1  |    1         |    1        |
|   2  |  Lisa  |      |   2  |  Renang |    |   2  |    1         |    3        |
|   3  |  Jisoo |      |   3  |  Nyanyi |    |   3  |    1         |    4        |
|   4  |  Jennie|      |   4  |  Youtube|    |   4  |    3         |    5        |
-----------------      |   5  |  Masak  |    -------------------------------------
                       ------------------


I want to count all hobby by that person

Example I want select Rose :          Or I want select Jisoo :

---------------------------                    ---------------------------
|  id  |  hobby  |  count |                    |  id  |  hobby  |  count |
---------------------------                    ---------------------------
|  1   |  Makan  |  1     |                    |  1   |  Makan  |  0     |
|  2   |  Renang |  0     |                    |  2   |  Renang |  0     |
|  3   |  Nyanyi |  1     |                    |  3   |  Nyanyi |  0     |
|  4   |  Youtube|  1     |                    |  4   |  Youtube|  0     |
|  5   |  Masak  |  0     |                    |  5   |  Masak  |  1     |
---------------------------                    ---------------------------

И так далее, как мне решить эту проблему?

Это мой запрос, который я пишу, но, похоже, не работает, потому что только данные с числом больше 0показано.

SELECT
    hobby.id,
    hobby.name,
    count( referensi.id ) AS count 
FROM
    referensi
    LEFT OUTER JOIN hobby ON hobby.id = referensi.ref_hobby
    JOIN person ON referensi.ref_person = person.id 
    WHERE person.id = 1
GROUP BY
    hobby.id

Заранее спасибо.

Ответы [ 3 ]

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

Вы хотите начать присоединение из таблицы hobby и использовать от LEFT JOIN s до optionnaly , чтобы вызвать соответствующие записи в других таблицах.

SELECT
    h.id,
    h.hobby,
    count( p.id ) AS count 
FROM
    hobby h
    LEFT JOIN referensi r ON h.id = r.ref_hobby
    LEFT JOIN person p ON r.ref_person = p.id AND p.id = 1
WHERE p.name is NULL OR p.name = 'Rose'
GROUP BY h.id, h.hobby

Это такжеХорошей практикой является использование псевдонимов таблиц, я добавил их в ваш запрос.

Демонстрация на DB Fiddle для пользователя Rose:

| id  | hobby   | count |
| --- | ------- | ----- |
| 1   | Makan   | 1     |
| 2   | Renang  | 0     |
| 3   | Nyanyi  | 1     |
| 4   | Youtube | 1     |
| 5   | Masak   | 0     |
0 голосов
/ 09 февраля 2019

Чтобы решить эту проблему, вам нужно от JOIN referensi до person, выбрав только записи в referensi, соответствующие интересующему лицу, а затем от RIGHT JOIN до hobby.Если соответствующей записи нет, выходной результат равен 0, иначе 1. Например, для персоны 1:

SELECT h.id, 
       h.hobby, 
       CASE WHEN r.id IS NULL THEN 0 ELSE 1 END AS count
FROM referensi r
JOIN person p ON p.id = r.ref_person AND p.id = 1
RIGHT JOIN hobby h ON h.id = r.ref_hobby
ORDER BY h.id

Это также может быть реализовано с помощью коррелированного подзапроса:

SELECT h.id, 
       h.hobby, 
       EXISTS (SELECT * FROM referensi r WHERE r.ref_hobby = h.id AND r.ref_person = 1) AS count
FROM hobby h

Если кортеж человека / хобби может появляться в таблице referensi более одного раза, вам необходимо выполнить вывод COUNT:

SELECT h.id, 
       h.hobby, 
       COUNT(r.id) AS count
FROM referensi r
JOIN person p ON p.id = r.ref_person AND p.id = 1
RIGHT JOIN hobby h ON h.id = r.ref_hobby
GROUP BY h.id

(для всех трех запросов данных примера):

id  hobby       count
1   Makan       1
2   Renang      0
3   Nyanyi      1
4   Youtube     1
5   Masak       0

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

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

Вы можете попытаться использовать функцию обострения условия с OUTER JOIN

, установив условие в CASE WHEN

Запрос 1 :

SELECT
    hobby.id,
    hobby.name,
    COUNT(CASE WHEN person.id = 3 THEN 1 END) AS count 
FROM
    hobby  
    LEFT JOIN referensi  ON hobby.id = referensi.ref_hobby
    LEFT JOIN person ON referensi.ref_person = person.id 
GROUP BY
    hobby.id,
    hobby.name

Результаты :

| id |    name | count |
|----|---------|-------|
|  1 |   Makan |     0 |
|  2 |  Renang |     0 |
|  3 |  Nyanyi |     0 |
|  4 | Youtube |     0 |
|  5 |   Masak |     1 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...