mysql - 如何从有条件的 3 个表中加入

标签 mysql sql join

我的数据库中有 3 个表,我的第一个表是 person 表,它存储所有人的姓名,我的第二个表是 hobby 表,它存储所有人的所有爱好,第三个表是 referensi 表存储所有引用的人和爱好。

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

提前致谢。

最佳答案

要解决此问题,您需要JOIN referensiperson,仅选择referensi 中对应于感兴趣的人,然后 RIGHT JOINhobby。如果没有匹配的条目,则输出为 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

如果一个 person/hobby 元组可以多次出现在 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

Demo on SQLFiddle

关于mysql - 如何从有条件的 3 个表中加入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54602341/

相关文章:

php - 简化: mysqli num_rows not working

android - 如何通过Android设备连接到远程MySQL数据库?

mysql - 将一条表记录插入到另一个表中

mysql - 相互关注用户信息

php - 在连接中获取多行(codeigniter)

python - 在 Mysql 过程中循环遍历字符串

php - MYSQL JOIN所有子行,父行只显示一次

sql - 如何计算Postgresql中的最大列数

mysql - T-sql查询问题

sql - 如何避免 SQL 中的重复子查询 JOIN?