2013-11-11 4 views
0

SQL FIDDLE HERESQL возвращение NULL вместо пустого результата

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

SELECT *, GROUP_CONCAT(item_category) AS item_categories 
FROM (`dev_pages`) 
LEFT JOIN `dev_items_to_categories` ON `dev_items_to_categories`.`item_id` = `dev_pages`.`page_id` 
WHERE deleted_time IS NULL 
AND `page_type` = 'blog' 
AND `item_category` = '16' 
ORDER BY `page_title` ASC 

Он работает нормально, но если нет результатов вместо возвращаться ничто возвращает NULL или значение по умолчанию (см SQL скрипку)

мне удалось сделать вокруг, но мне было интересно, если кто-то лучшее решение этой проблемы:

SELECT a.* FROM (

    SELECT *, GROUP_CONCAT(item_category) AS item_categories 
    FROM (`dev_pages`) 
    LEFT JOIN `dev_items_to_categories` ON `dev_items_to_categories`.`item_id` = `dev_pages`.`page_id` 
    WHERE deleted_time IS NULL 
    AND `page_type` = 'blog' 
    AND `item_category` = '16' 
    ORDER BY `page_title` ASC 

) AS a 
WHERE page_id > 0 
+1

Вам не хватает 'GROUP BY'. И любые условия в таблице 'dev_items_to_categories' должны находиться в разделе' ON', а не 'WHERE'. – Barmar

ответ

1

Вам нужен GROUP BY пункт:

SELECT *, GROUP_CONCAT(item_category) AS item_categories 
FROM (`dev_pages`) 
LEFT JOIN `dev_items_to_categories` ON `dev_items_to_categories`.`item_id` = `dev_pages`.`page_id` AND `item_category` = '16' 
WHERE deleted_time IS NULL 
AND `page_type` = 'blog' 
GROUP BY dev_pages.page_id 
ORDER BY `page_title` ASC 

Вы также должны поместить item_category = '16' в пункте ON. В противном случае вы отфильтровываете строки без совпадений в dev_items_to_categories; так как вы используете LEFT JOIN, а не INNER JOIN, я предполагаю, что вам нужны строки с нулевыми совпадениями.

FIDDLE

+0

Спасибо за ответ, это помогло мне решить проблему, но AND 'item_category' = '16' в соединении, похоже, ничего не сделал, но положил его как работающий – Adam

+0

Но если вы поместите его в' WHERE ', то вы не получите строки из' dev_pages', которые не имеют соответствия в 'dev_items_to_categories'. Причина использования 'LEFT JOIN' вместо' INNER JOIN' заключается в том, что вы хотите, чтобы эти строки отображались в результате. – Barmar

0

Вы также можете попробовать объединить функцию.

SELECT *, GROUP_CONCAT(coalece(item_category,'')) AS item_categories 
FROM (`dev_pages`) 
LEFT JOIN `dev_items_to_categories` ON `dev_items_to_categories`.`item_id` = `dev_pages`.`page_id` 
WHERE deleted_time IS NULL 
AND `page_type` = 'blog' 
AND `item_category` = '16' 
ORDER BY `page_title` ASC 
Смежные вопросы