我有一张这样的表:
id group_id meta
1 A last_activity
2 A post_id
3 B last_activity
4 C last_activity
5 C post_id
我想只返回没有值的group_id" post_id'在列meta
我尝试过NOT IN
,<>
等不同的解决方案,但我无法得到正确的结果。
类似的东西:
$sql_group_id = ("SELECT group_id FROM `table` WHERE meta <> 'post_id'");
结果将是:group_id = B
我该怎么做?
答案 0 :(得分:8)
试试这个:
SELECT group_id
FROM mytable
GROUP BY group_id
HAVING SUM(meta='post_id') = 0
查询在其HAVING
子句中使用条件聚合,以便过滤掉至少有一条与meta='post_id'
相关的记录的记录组。
答案 1 :(得分:2)
SELECT group_id
FROM `table`
WHERE group_id NOT IN (SELECT group_id
FROM `table`
WHERE meta like '%post_id%'
GROUP BY group_id);
或者可以尝试:
SELECT group_id
FROM `table`
WHERE group_id NOT IN (SELECT DISTINCT group_id
FROM `table`
WHERE TRIM(BOTH ' ' FROM meta like) = 'post_id');
答案 2 :(得分:0)
您的查询返回具有任何其他元值的group_ids。相反,您应该使用not exists
运算符来查询那些没有post_id元值的人:
SELECT DISTINCT group_id
FROM mytable a
WHERE NOT EXISTS (SELECT *
FROM mytable b
WHERE a.group_id = b.group_id and b.meta = 'post_id')
答案 3 :(得分:0)
使用CASE
表达式。
<强>查询强>
select t.`group_id` from(
select `group_id`,
sum(case `meta` when 'post_id' then 1 else 0 end) as `new_col`
from `table`
group by `group_id`
)t
where t.`new_col` = 0;
答案 4 :(得分:0)
使用以下
$sql_group_id = ("SELECT group_id FROM `table` WHERE meta not in ('post_id')");