2016-10-07 8 views
1

Я хочу, чтобы выбрать DISTINCT (p.ptype) в то же время я также хочу, чтобы получить c.category если p.ptype не в наборе c.ptypeИспользование DISTINCT с FIND_IN_SET

База данных таблицы : р

id ptype 
1 Shirts 
2 Cups 
3 Shirts 
4 Mugs 

Таблица базы данных: с

id category ptype 
1 Test  Pants, Shirts, TShirts 
2 Test1  Cups, Mats, Rugs 

команда SQL Я попытался следующим образом

SELECT DISTINCT(p.ptype), IF(FIND_IN_SET(p.ptype, c.ptype), c.category,'') as category 
FROM p, c 

Это выдает p.ptype, которые установлены в два раза. Один раз с пустой поле c.category и один с заполненной c.category.

Однако желаемый результат заключается в следующем

ptype category 
Shirts Test 
Cups  Test1 
Mugs 

ответ

2

Попробуйте сделать явный LEFT JOIN на ptype из p таблицы присутствует в списке CSV в c таблицы:

SELECT DISTINCT p.ptype, COALESCE(c.category, '') AS category 
FROM p 
LEFT JOIN c 
    ON FIND_IN_SET(p.ptype, c.ptype) > 0 

В вашем первоначальный запрос, выполняли кросс-соединение. Это создает все возможные комбинации между записями двух таблиц. Было бы сложно получить правильный ответ, используя перекрестное соединение, поэтому предпочтительнее левое соединение.

Демо здесь:

SQLFiddle