2016-09-07 2 views
0

Привет иметь следующую схему базы данных:MySQL - Невозможно использовать GROUP_CONCAT и фильтр результатов

items 
- id 
- item_name 

items_cats 
- item_id 
- cat_id 

categories 
- id 
- cat_name 

С этого момента, я могу выбрать элементы и категории в одном запросе так:

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 

Этот результат что-то вроде этого:

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 

Теперь мне нужно один и тот же результат, но я хочу только записи, содержащие «C в 3". Если добавить «c.id = 3» в выражении WHERE, результаты в этом:

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

Но я хочу, чтобы другие категории из пункта, например:

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

Как я могу это сделать ?

ответ

0

Я нашел решение. Просто добавил следующее в конце запроса:

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

Во-первых, научиться использовать правильную JOIN синтаксис. Простое правило: Никогда запятой в разделе FROM; всегда использовать правильный явный JOIN синтаксис с условиями соединения в предложении ON.

Во-вторых, вы можете сделать это с помощью простого предиката в предложении HAVING:

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; 

Ваш сепаратор, кажется, имеет место в нем.

Если вы хотите сделать это по идентификатору, а затем использовать:

HAVING MAX(c.id = 3) > 0; 
Смежные вопросы