2017-09-04 1 views
0

Je ne trouve pas un moyen de faire ce travail: Je dois obtenir tous id1 qui ont id2''(empty string) et aussi un au moins non vide id2.Sélectionnez une valeur lorsque l'autre colonne a deux valeurs spécifiques

Je reçois cela comme: SELECT id1, id2 FROM mytable WHERE id1 = ... GROUP BY id1,id2

id1            id2 
1 b2-04af1ab73705-fb8000-006bfb81a78e5e5920 
2 b2-04af1ab73705-fb8000-006bfb81a78e5e5920  5835113447594857813 

Alors maintenant, je dois obtenir ce id1. J'ai essayé beaucoup de choses, mais le plus proche est true ou false si la condition est remplie, mais je ne peux pas obtenir le id1 respectif avec - j'en ai besoin car je veux l'exécuter sur un plus grand ensemble (pas mytable est sous-classé sur id1=...) .

Quand je l'essayer comme ceci:

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 

, je reçois cette erreur: Line 1:103 Expression not in GROUP BY key 'visitorid' et ne peut pas trouver un moyen de contourner cela.

Des idées, s'il vous plaît?

EDIT:

a résolu le problème avec l'aide de Dennis comme suit:

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) 

Répondre

0

Modifier

Il est apparemment possible de le faire en 1 Go, ce qui évite de polluer votre base de données. Voir la réponse par @Dudu Markovitz


Il est probablement possible de construire dans cette déclaration 1 et d'éliminer ainsi la création de tables temporaires (ou vue).

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; 

Notez que « non vide » n'est pas une définition claire, de sorte que vous devrez peut-être ajuster la déclaration où dans la deuxième ligne pour répondre à vos besoins.

+0

Oh oui, je suis allé avec une manière horriblement complexe. Je l'ai fait fonctionner avec simplement 'select' et' join' sur les deux sélections et en prenant distinctement 'id1'! Merci de montrer cette idée :) Je l'éditerai dans ma question –

+0

Sérieusement? .................. –

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

Ceci devrait être la réponse acceptée. – leftjoin

+0

Très gentil, ne savait pas que HQL supportait des clauses ayant des clauses aussi compliquées! –