当其他列有两个特定值时选择一个值
我找不到一种方法来完成这项工作:我需要获得所有id1
有id2
''(empty string)
以及一个至少非空id2
。当其他列有两个特定值时选择一个值
我得到这个为:SELECT id1, id2 FROM mytable WHERE id1 = ... GROUP BY id1,id2
id1 id2
1 b2-04af1ab73705-fb8000-006bfb81a78e5e5920
2 b2-04af1ab73705-fb8000-006bfb81a78e5e5920 5835113447594857813
所以现在我需要得到这个id1
。我尝试了很多东西,但最接近的是得到true
或false
如果条件满足,但不能得到各自的id1
与它 - 我需要它,因为我想在较大的集合上运行(不是mytable
是在id1=...
子集) 。
当我尝试这样的:
SELECT if(sum(if(tab1.id1 != '', 1, 0)) < count(tab1.id2), tab1.id1,false) as myguy
FROM
( SELECT id1,id2
FROM mytable
WHERE id1 = 'b2-04af1ab73705-fb8000-006bfb81a78e5e5920'
GROUP BY visitorid,platformvisitorid
) AS tab1
,我得到这个错误:Line 1:103 Expression not in GROUP BY key 'visitorid'
并不能找到办法解决它。
有什么想法吗?
编辑:
与丹尼斯的帮助下解决了这个问题,如下所示:
SELECT tab4.id1 FROM
(SELECT tab1.id1 FROM (SELECT id1, id2 FROM mytable GROUP BY id1, id2) tab1 WHERE id2!='') tab3
INNER JOIN
(SELECT tab2.id1 FROM (SELECT id1, id2 FROM mytable GROUP BY id1, id2) tab2 WHERE id2='') tab4
ON (tab3.id1 = tab4.id1)
编辑
这显然是有可能做到这一点在1路走,以防止污染您的数据库。见@Dudu Markovitz
答案这可能是不可能建立这种成1条语句,从而消除临时表(或视图)的创建。
CREATE TABLE tempa AS SELECT DISTINCT id1 from mytable where id2 = '';
CREATE TABLE tempb AS SELECT DISTINCT id1 from mytable where id2 != '';
SELECT tempa.id1 FROM tempa INNER JOIN tempb on tempa.id1 = tempb.id1;
请注意,'not empty'不是一个明确的定义,所以您可能需要调整第二行中的where语句以满足您的需求。
select id1
from mytable
group by id1
having count(case when id2 = '' then 1 end) > 0
and count(case when id2 <> '' then 1 end) > 0
这应该是被接受的答案。 – leftjoin
很不错,不知道HQL支持这样复杂的句子! –
哦,是的,我走了一个可怕的复杂的方式。我使用select和join两个选项,然后采用不同的'id1'!感谢您指出这个想法:) 我会在我的问题编辑 –
认真? .................. –