我可以在RIGHT JOIN或JOIN中选择不在的行吗?

时间:2019-04-17 13:58:34

标签: mysql sql join left-join right-join

我想找到一个不参加活动的团体。

有我的桌子:

groupe:

+-----------+-------------+-----------+-------------+
| id_groupe | id_createur |    name   | description |
+-----------+-------------+-----------+-------------+
|     1     |      5      |   tagada  |    epic     |
+-----------+-------------+-------------------------+
|     2     |      1      |   banana  |    good     |
+-----------+-------------+-----------+-------------+
|     3     |      1      | blueberry |  legendary  |
+-----------+-------------+-----------+-------------+
|     4     |      2      |   coco    |    great    |
+-----------+-------------+-----------+-------------+

第1组是由成员5创建的,名字是'tagada',描述是'epic'。

事件:

+-----+-------------+----------------+
| id  |     name    |  description   | 
+-----+-------------+----------------+
|  1  |    lunch    |for lunch monday|
+-----+-------------+----------------+
|  2  |    game     | play videogame |
+-----+-------------+----------------+

事件1的名称为“午餐”,而他的描述为“周一午餐”。

groupe_events:

+--------------+--------------+
| id_groupe_ge | id_events_ge |
+--------------+--------------+
|      1       |      2       |
+--------------+--------------+
|      2       |      2       |
+--------------+--------------+
|      3       |      2       |
+--------------+--------------+
|      1       |      1       |
+--------------+--------------+
|      3       |      1       |
+--------------+--------------+

例如,第1,第2和第3组将参加事件2,第1和第4组将参加事件1

如果我使用LEFT JOIN,则无法指定事件的ID(id_groupe_ge)

Mysql

SELECT * 
FROM groupe 
    LEFT JOIN groupe_events ON id_groupe_ge = id_groupe 
WHERE id_groupe_ge IS NULL

或 mysql

SELECT * 
FROM groupe 
    LEFT JOIN groupe_events ON id_groupe_ge = id_groupe 
WHERE id_events_ge IS NULL OR id_events_ge <> 2

通过这种方法,我还拥有id_events_ge 1的行

如果我使用classique JOIN和WHERE,则有参加的小组,而恰恰相反

Mysql

SELECT * 
FROM groupe 
    JOIN groupe_events ON id_groupe_ge = id_groupe 
WHERE id_events_ge = 2

例如,如何找到未参加活动2的小组? 这一个:

+-----------+-------------+-----------+-------------+
|     4     |      2      |   coco    |    great    |
+-----------+-------------+-----------+-------------+

其他示例,例如,我想查找不参加活动1的组? 这一个:

+-----------+-------------+-----------+-------------+
|     2     |      1      |   banana  |    good     |
+-----------+-------------+-----------+-------------+
|     4     |      2      |   coco    |    great    |
+-----------+-------------+-----------+-------------+

3 个答案:

答案 0 :(得分:0)

请先回答您的问题:

  

我想找到一个不参加活动的团体...

我将进行外部联接,如:

select g.*
from groupe g
left join groupe_events ge on ge.id_group_ge = g.id_groupe
where ge.id_group_ge is null

答案 1 :(得分:0)

如果要根据组ID查找不参与的组,则:

select group.*
from groupe
left join groupe_events on groupe_events.id_group_ge = groupe.id_groupe
where groupe_events.id_group_ge is null and groupe_events.id_events_ge = 'put-your-id-here'

否则,请使用与@The Impaler回答的查询相同的查询

答案 2 :(得分:0)

要查找不参与特定 事件的组,您需要将该条件包括在JOIN中,然后检查结果NULLgroupe_events表中。例如,要查找不参与事件1的组:

SELECT g.*
FROM groupe g
LEFT JOIN groupe_events ge ON ge.id_groupe_ge = g.id_groupe AND ge.id_events_ge = 1
WHERE ge.id_groupe_ge IS NULL

输出:

id_groupe   id_createur name    description
2           1           banana  good
4           2           coco    great

对于事件2:

SELECT g.*
FROM groupe g
LEFT JOIN groupe_events ge ON ge.id_groupe_ge = g.id_groupe AND ge.id_events_ge = 2
WHERE ge.id_groupe_ge IS NULL

输出:

id_groupe   id_createur name    description
4           2           coco    great

Demo on dbfiddle