2016-09-07 1 views
0

Hallo das folgende Datenbankschema hat:MySQL - Kann nicht GROUP_CONCAT verwenden und Filterergebnisse

items 
- id 
- item_name 

items_cats 
- item_id 
- cat_id 

categories 
- id 
- cat_name 

Ab jetzt kann ich die Artikel und Kategorien in einer einzigen Abfrage so wählen:

SELECT i.id, i.item_name, GROUP_CONCAT(c.cat_name) as cats 
FROM items AS i, items_cats AS ic, categories AS c 
WHERE ic.item_id = i.id AND ic.cat_id = c.id 
GROUP BY i.id 

Dieses Ergebnis etwas wie folgen aus:

id| item_name | cats 
1 | Item 1 | Cat 1, Cat 2 
2 | Item 2 | Cat 1 
3 | Item 3 | Cat 3, Cat 5 
4 | Item 4 | Cat 2, Cat 3, Cat 4 

Jetzt muß ich das gleiche Ergebnis, aber ich will nur die Datensätze enthält, „C um 3". Wenn ich hinzufügen "c.id = 3" in WHERE-Klausel, ergibt dies:

id| item_name | cats 
3 | Item 3 | Cat 3 
4 | Item 4 | Cat 3 

Aber ich die anderen Kategorien vom Einzelteil wünschen, wie folgt aus:

id| item_name | cats 
3 | Item 3 | Cat 3, Cat 5 
4 | Item 4 | Cat 2, Cat 3, Cat 4 

Wie kann ich das tun ?

Antwort

0

Ich habe eine Lösung gefunden. Just added die folgenden am Ende der Abfrage:

HAVING cats LIKE CONCAT('%', (SELECT cat_name FROM categories WHERE id = 3), '%') 
0

Zuerst lernen die richtige JOIN Syntax zu verwenden. Einfache Regel: Nie Kommas in der FROM Klausel verwenden; immer verwenden Sie die explizite JOIN Syntax mit den Join-Bedingungen in der ON Klausel.

Zweitens können Sie tun dies durch ein einfaches Prädikat in der HAVING-Klausel:

SELECT i.id, i.item_name, GROUP_CONCAT(c.cat_name SEPARATOR ', ') as cats 
FROM items i JOIN 
    items_cats ic 
    ON ic.item_id = i.id JOIN 
    categories c 
    ON ic.cat_id = c.id 
GROUP BY i.id 
HAVING MAX(c.cat_name = 'Cat 3') > 0; 

erscheint Ihr Separator darin, einen Raum zu haben.

Wenn Sie dies von id tun wollen, dann verwenden:

HAVING MAX(c.id = 3) > 0;