2017-09-04 94 views
0

我找不到一種方法來完成這項工作:我需要獲得所有id1id2''(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。我嘗試了很多東西,但最接近的是得到truefalse如果條件滿足,但不能得到各自的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) 

回答

0

編輯

這顯然是有可能做到這一點在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語句以滿足您的需求。

+0

哦,是的,我走了一個可怕的複雜的方式。我使用select和join兩個選項,然後採用不同的'id1'!感謝您指出這個想法:) 我會在我的問題編輯 –

+0

認真? .................. –

2
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 
+1

這應該是被接受的答案。 – leftjoin

+0

很不錯,不知道HQL支持這樣複雜的句子! –

相關問題