“如果表中存在价值” - 是否有这样的事情?

时间:2013-08-13 11:02:05

标签: mysql database

我是mysql的新手,我需要一些帮助。 我想从存在值的表中选择所有行,但不选择该值:

例如:

ID           ITEM
--------------------
1             AA
1            22S
1             AB
2            F45
2             BB
3             1
3             1
3             AA
3            F45
3            F67
3             A
......

类似于:SELECT ID,ITEM FROM TABLE1 IF项目“AA”除“AA”外 那会回来:

1  225,AB
3  1,1,F45,F67,A

这样做的实际查询是什么?谢谢

4 个答案:

答案 0 :(得分:5)

您可以使用group_concat()

获取列表
SELECT ID, group_concat(case when ITEM <> 'AA' then ITEM end)
FROM TABLE1 
group by id
having sum(item = 'AA') > 0;

case语句确保该值不包含在最终列表中。 group_concat()忽略NULL个值。

having子句确保返回的行至少有一个'AA'值。

编辑:

感谢Praveen:

<强> Fiddle here

答案 1 :(得分:1)

此查询将为您提供与AA项目关联的ID列表:

SELECT DISTINCT(id) FROM table WHERE item = 'AA'

您可以将它用作子查询(将其嵌入到更大的查询中)以通过仅考虑具有AA项的ID的行来获得所需的结果,除了那些具有AA项本身的行:

SELECT id, GROUP_CONCAT(item) FROM table
WHERE id IN (SELECT DISTINCT(id) FROM table WHERE item = 'AA')
  AND item != 'AA'
GROUP BY id

答案 2 :(得分:0)

SELECT tbl.id,
    GROUP_CONCAT(tbl.item) AS item
FROM tbl
INNER JOIN (
    SELECT id,
        item
    FROM tbl
    WHERE item = 'AA'
) tmp ON
    tmp.id = tbl.id
WHERE item <> 'AA'

试试上面的代码。

答案 3 :(得分:0)

这里,'id'似乎是另一个表的外键(因为id通常意味着身份)。如果您有这样的表,您寻找的数据将通过以下方式返回:

SELECT y.id, y.item
FROM yourtable y
INNER JOIN othertable o
ON y.id=o.id
INNER JOIN yourtable a
ON a.id=o.id
WHERE a.item='AA'
AND y.item<>'AA'

但是这将返回多行(例如,id为1的两个条目 - 1,225和1,AB)。要将结果合并为一行(通常非常糟糕的做法 - sionce结果集在查询中不可重用):

SELECT y.id, GROUP_CONCAT(y.item)
FROM yourtable y
INNER JOIN othertable o
ON y.id=o.id
INNER JOIN yourtable a
ON a.id=o.id
WHERE a.item='AA'
AND y.item<>'AA'
GROUP BY y.id

如果您没有其他表格,那么仍然可以通过重新创建缺失表格的再次表达来实现:

SELECT y.id, GROUP_CONCAT(y.item)
FROM yourtable y
INNER JOIN (
     SELECT DISTINCT a.id
     FROM yourtable a
     WHERE a.item='AA'
) o
ON y.id=o.id
WHERE y.item<>'AA'
GROUP BY y.id

BTW在同一列中混合不同的类型数据也是一个坏主意。