2017-02-24 6 views
0

ich eine Tabelle wie folgt aus:SQL-Select-Reihen mit einem fehlenden Wert

id  group_id meta 
1  A   last_activity 
2  A   post_id 
3  B   last_activity 
4  C   last_activity 
5  C   post_id 

ich nur die group_id zurückkehren möchten, wo es nicht der Wert 'post_id' in Spalte meta

I‘ habe verschiedene Lösungen mit NOT IN, <> usw. ausprobiert, aber ich kann nicht das richtige Ergebnis bekommen.

Etwas wie:

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

Das Ergebnis wäre: group_id = B

Wie kann ich das tun?

Antwort

8

Try this:

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

Die Abfrage verwendet eine bedingte Aggregat in seiner HAVING Klausel, um Gruppen von Datensätzen, um herauszufiltern mit meta='post_id' mindestens einen verknüpften Datensatz mit.

+2

würden Sie nicht COUNT() verwenden hier statt SUM()? –

+3

@AdamCopley Dies ist die Art, wie wir * speziell in MySQL * 'SUM' mit einem booleschen Ausdruck kombinieren, der entweder 1 oder 0 zurückgibt. Achtung:' COUNT (0) 'ist gleich 1. –

+0

Ahh ich sehe, sehr nett und großartig Spot über Anzahl (0). Vielen Dank! –

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); 

Oder könnte versuchen, mit:

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

Das bringt auch A und C – apomene

+0

@apomene Laut meinem Test funktioniert es nicht. Das war genau das, was ich versuchte: eine Unterabfrage mit 'NOT IN' zu verwenden. –

+0

@ SébastienGicquel Ich habe '% post_id%' nur benutzt, um Leerzeichen zu vermeiden – McNets

0

Ihre Abfrage gibt die GROUP_IDs, die anderen Meta-Wert hat. Stattdessen sollten Sie die not exists Operator diejenigen abzufragen, die nicht den Meta-Wert von post_id haben:

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

Von meinen Tests gibt es alle b.group_id zurück –

0

Verwenden Sie einen CASE Ausdruck.

Abfrage

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

Was ist 'new_col'? –

0

Verwenden folgenden

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

Von meinem Test gibt es alle Zeilen von 'Tabelle' zurück –

Verwandte Themen