1

SQLフィドルはこちら

投稿が複数のカテゴリを持つことができる単純なブログ システムを作成しているので、次のクエリがあります。

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 Fiddle を参照)。

私はなんとか回避できましたが、誰かがこれに対するより良い解決策を持っているかどうか疑問に思っていました:

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 
4

2 に答える 2

2

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_categoriesLEFT JOINではなくを使用しているためINNER JOIN、null に一致する行が必要だと思います。

フィドル

于 2013-11-11T15:55:50.210 に答える
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
于 2013-11-11T15:51:02.897 に答える