我是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
这样做的实际查询是什么?谢谢
答案 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在同一列中混合不同的类型数据也是一个坏主意。