MySQL Join:如果一行符合条件,则忽略所有重复行

时间:2014-02-07 17:16:00

标签: mysql sql database join

给出以下示例表

TABLE_A
-----
 ID  
-----
  1
  2
  3
  4
  5

TABLE_B
---------------------------
 TABLE_A_ID        DETAIL
---------------------------
    1               val_x
    2               val_x
    2               val_y
    4               val_y
    5               val_other

我正在这两个表上进行左连接并获得以下输出

-------------------------------
   TABLE_A_ID        DETAIL
-------------------------------
       1              val_x
       2              val_y
       2              val_x
       3              null
       4              val_y
       5              val_other

这是我对左连接的期望。

我遇到的问题是我还要删除具有DETAIL = val_y的行和所有具有重复TABLE_A_ID的行。如果组中的任何行都有DETAIL = val_y

所以我需要的输出是

-------------------------------
   TABLE_A_ID        DETAIL
-------------------------------
       1              val_x
       3              null
       5              val_other

我尝试过使用GROUP_BY TABLE_A_IDHAVING DETAIL != val_y,但这似乎不起作用。我认为由于显而易见的原因,GROUP_BYHAVING用于聚合并消除小于或大于正确的值?

有没有办法在MySQL中执行此操作,还是我要求太多?

注意:这些是EXAMPLE表。它们并不反映生产系统,因此不会在问题和范例之外发表任何评论或答案 - 它只会让事情变得混乱。

5 个答案:

答案 0 :(得分:2)

SELECT sub1.id table_a_id, sub1.detail
FROM (
    SELECT a.id, detail
    FROM table_a a
    LEFT JOIN table_b b on a.id = b.table_a_id) sub1
LEFT JOIN (
    SELECT DISTINCT table_a_id
    FROM table_b
    WHERE detail = 'val_y') sub2 
ON sub1.id = sub2.table_a_id
WHERE sub2.table_a_id IS NULL

sub2子查询会查找符合您删除条件的所有ID。然后将其与原始查询结合以过滤掉这些ID。

DEMO

答案 1 :(得分:1)

您可以使用另一个LEFT JOIN来消除带有'val_y'值的ID;

SELECT a.id as table_a_id, b1.detail 
FROM table_a a
LEFT JOIN table_b b1 ON a.id = b1.table_a_id
LEFT JOIN table_b b2 ON a.id = b2.table_a_id AND b2.detail = 'val_y'
WHERE b2.detail IS NULL

An SQLfiddle to test with(使用新的样本数据更新)

答案 2 :(得分:0)

试试这个:

   SELECT b.table_a_id, b.detail
   FROM table_a a JOIN table_b b ON a.id = b.id
   GROUP BY b.table_a_id
   HAVING COUNT( b.table_a_id ) == 1;

答案 3 :(得分:0)

类似

select * from table_b where table_a_id not in (
    select TABLE_A_ID from TABLE_B where detail = 'val_y'
)

答案 4 :(得分:0)

我认为下面会帮助你

Select a.ID ,b.Detail
From Table1 a 
LEFT OUTER JOIN (SELECT id ,count(*) from Table2 group by id having count(*) =1 ) b
ON a.id = b.ID