2017-02-24 66 views
0

我有一个这样的表:列元SQL与缺失值选择行

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”

我我尝试了不同的解决方案,如NOT IN<>等,但我无法得到正确的结果。

喜欢的东西:

$sql_group_id = ("SELECT group_id FROM `table` WHERE meta <> 'post_id'"); 

其结果将是:group_id = B

我怎样才能做到这一点?

回答

8

试试这个:

SELECT group_id 
FROM mytable 
GROUP BY group_id 
HAVING SUM(meta='post_id') = 0 

查询其HAVING条款使用条件骨料,以过滤掉的记录组具有meta='post_id'至少一个相关的记录。

+2

你会不会使用COUNT()在这里,而不是SUM()? –

+3

@AdamCopley这是我们结合*特别是在MySQL *'SUM'与布尔表达式返回1或0.注意:'COUNT(0)'等于1. –

+0

啊我看,非常好,很棒点数(0)。谢谢! –

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'); 
+0

这也将带来A和C – apomene

+0

@apomene根据我的测试,它不工作。这正是我想要做的:用'NOT IN'使用子查询 –

+0

@SébastienGicquel我已经使用'%post_id%'只是为了避免任何尾随空间 – McNets

0

您的查询返回的任何其他meta值的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') 
+0

从我的测试中,它返回所有b.group_id –

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; 
+0

什么是'new_col'? –

0

使用以下

$sql_group_id = ("SELECT group_id FROM `table` WHERE meta not in ('post_id')"); 
+0

从我的测试中,它返回'table'中的所有行 –