【问题标题】:SQL WHERE IS NOT NULL still returns null rowsSQL WHERE IS NOT NULL 仍然返回空行
【发布时间】:2018-12-13 11:03:45
【问题描述】:

我有一个查询,如果它们不是 NULL,我会选择所有记录,但我仍然会得到包含 NULL 行的结果。

这是我的查询:

SELECT cnt.id, cnt.title as content_title, cnt.alias as content_alias, cnt.images, cnt.introtext, cnt.catid, cat.title as cat_title, cat.alias as cat_alias,
MAX(case when f.field_id = 2 then f.value end) as regio
FROM snm_content cnt
LEFT JOIN snm_categories cat
ON cat.id = cnt.catid
LEFT JOIN snm_fields_values f
ON cnt.id = f.item_id 
WHERE cnt.id IS NOT NULL AND f.value LIKE '%Zeeland%'

您可以看到IS NOT NULL 部分,但我的数据库仍然显示所有带有NULL 的行,这是为什么呢?

【问题讨论】:

  • 它只是从查询中返回 0 行。
  • where 子句中使用来自f 的列可以有效地将left join 更改为inner join。将AND f.value LIKE '%Zeeland%' 放在on 子句中。此外,查询可能根本没有返回 farbiondriven 在他的评论中写的任何行。
  • @farbiondriven 但是在我的 php 循环中,我仍然得到一个空项,就好像代码看到一个结果一样。
  • 如果您向我们展示表中的原始数据,并告诉我们您希望查询返回哪些行,则问题会更容易理解。
  • 您没有保留不带空值的行,而是保留带有 的行。因此,保留 的行。 PS 了解 LEFT JOIN 返回的内容:INNER JOIN 行加上由 NULL 扩展的不匹配的左表行。作为 LEFT JOIN 的一部分,始终知道您想要什么 INNER JOIN。在 LEFT JOIN ON 删除任何由 NULL 扩展的行之后,需要右表列不为 NULL 的 WHERE 或 INNER ON,即只留下 INNER JOIN 行,即“将 LEFT JOIN 转换为 INNER JOIN”。你有那个。

标签: mysql sql database join


【解决方案1】:

大概,你想要这样的查询:

SELECT cnt.id, cnt.title as content_title, cnt.alias as content_alias, cnt.images, cnt.introtext, cnt.catid, cat.title as cat_title, cat.alias as cat_alias,
       MAX(case when f.field_id = 2 then f.value end) as regio
FROM snm_content cnt LEFT JOIN
     snm_categories cat
     ON cat.id = cnt.catid LEFT JOIN
     snm_fields_values f
     ON cnt.id = f.item_id AND f.value LIKE '%Zeeland%'
WHERE cnt.id IS NOT NULL
GROUP BY cnt.id;

您有一个没有GROUP BY 的聚合查询。这在任何其他数据库中都是错误的。如果我们假设 cnt.id 是唯一的,那么您可以通过它安全地聚合。

另一个问题是与f.value 的比较。如果您真的想要LEFT JOIN,那应该在ON 子句中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多