3

我是 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

4 回答 4

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'值。

编辑:

感谢普拉文:

在这里提琴

于 2013-08-13T11:05:50.143 回答
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
于 2013-08-13T11:06:55.213 回答
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'

试试上面的代码。

于 2013-08-13T11:06:30.650 回答
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 的 2 个条目)。将结果合并到一行中(通常是非常糟糕的做法——因为结果集在查询中不可重用):

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

顺便说一句,在同一列中混合不同类型的数据也是一个坏主意。

于 2013-08-13T11:13:01.663 回答