【问题标题】:SQL returning NULL instead of empty resultSQL 返回 NULL 而不是空结果
【发布时间】:2026-02-11 19:55:01
【问题描述】:

SQL FIDDLE HERE

我正在制作一个简单的博客系统,其中帖子可以有多个类别,所以我有这个查询:

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 

【问题讨论】:

  • 你错过了GROUP BY。并且dev_items_to_categories 表上的任何条件都应该在ON 子句中,而不是WHERE

标签: mysql sql group-concat


【解决方案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

【讨论】:

  • 感谢您的回答,它帮助我解决了问题,但是连接中的 AND item_category = '16' 似乎没有做任何事情,而是将其作为工作的地方
  • 但是如果你把它放在WHERE 子句中,那么你将不会从dev_pages 中得到与dev_items_to_categories 不匹配的行。使用LEFT JOIN 而不是INNER JOIN 的原因是因为您希望这些行出现在结果中。
【解决方案2】:

你也可以试试合并功能。

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

【讨论】:

    最近更新 更多