左连接的重复结果

qhhrdooz  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(220)

我试图查找表a中活动的成员,并确保它们位于表b中相应的用户组中。返回的行应该是不匹配的:不在组56中的活动用户,或不在组56中的非活动用户。
表b本质上只是一个外键表,用户将根据分配给的组数显示多次。我只关心56组。
我已经让它工作了,除了一个事实,我得到了每个用户对应的组总数返回多行。

Table A                  Table B
-----------------        ------------------------
m_id|name|email|active   group_id | user_id | etc
 01 |Abby|a@b.c|  1         01    |   01    | etc
 02 |Bob |b@b.c|  1         56    |   01    | etc
 03 |Carl|c@b.c|  1         56    |   02    | etc
 04 |Dan |d@b.c|  0         02    |   02    | etc
                            66    |   02    | etc
                            99    |   02    | etc
                            01    |   03    | etc
                            56    |   04    | etc

mysql查询如下:

SELECT * FROM B LEFT JOIN A
ON B.user_id = A.m_id
WHERE (B.group_id = 56 AND A.active != 1) 
OR
(B.user_id NOT IN 
(SELECT DISTINCT B.user_id FROM B 
LEFT JOIN A ON B.user_id = A.m_id 
WHERE B.group_id = 56) AND A.active = 1)
brvekthn

brvekthn1#

您当前的方法可以通过使用 Group By 使用条件筛选 Having 条款。
我们将使用 Sum() 带条件的函数检查 group_id = 56 一排。它将返回1或0,这取决于它是真是假。如果我们想让一个特定的情况至少发生一次,那么 Sum() 此条件的值应大于0,反之亦然。

SELECT tA.m_id, 
       tA.name, 
       tA.email, 
       tA.active 
FROM tableA AS tA 
LEFT JOIN tableB AS tB 
  ON tA.m_id = tB.user_id 
GROUP BY tA.m_id, 
         tA.name, 
         tA.email, 
         tA.active 
HAVING 
  (tA.active = 1 AND 
   NOT SUM(tb.group_id = 56)) -- active and no row having group_id = 56
        OR 
  (tA.active = 0 AND 
   SUM(tb.group_id = 56))  -- inactive and atleast one row having group_id = 56

相关问题