【问题标题】:Change SQL query to show categories that are empty更改 SQL 查询以显示为空的类别
【发布时间】:2011-10-21 14:16:08
【问题描述】:

不久前,我在this SQL query 寻求帮助。它显示属于父类别的 sn-ps,使用类别 ID 将它们联系在一起。我尝试将其更改为显示所有类别,即使里面没有 sn-ps 但我无法管理它。

我确定这不是 PHP 问题,因为打印此查询的结果不会显示空类别。

我只需要帮助理解这一点以及我需要更改什么以使其显示我需要的内容。

这是 SQL:

SELECT c.id AS cid, c.slug AS cslug, c.name AS cname, s.id AS sid, s.name AS sname 
FROM categories AS c 
LEFT JOIN snippets AS s ON s.category = c.id 
WHERE c.live=1 AND s.live=1 AND c.company='$company' AND s.company='$company' 
ORDER BY c.name, s.name

任何关于学习 SQL 的好资源的提示和链接也将不胜感激。 :)

以下是通过 PHP 运行时查询返回的示例。 SQLhttp://jsbin.com/obonalPHPInefficient SQL Query

【问题讨论】:

  • 你能发布一个示例结果吗?
  • 使用 SQL 和 PHP 示例编辑了我的 OP

标签: sql


【解决方案1】:

将 sn-p 条件移动到连接的on 子句中。

如果你将它留在where 子句中,则需要结果行来匹配它,但 sn-p 中缺少的行将具有null 值,因此s.live=1 将是false,你会得到不匹配。

在 on 子句中,只需要来自 sn-p 的行来匹配它,但是对于 left,匹配是可选的,因此当 sn-p 不匹配时,您仍然可以从类别中获取行:

SELECT c.id AS cid, c.slug AS cslug, c.name AS cname, s.id AS sid, s.name AS sname 
FROM categories AS c 
LEFT JOIN snippets AS s ON s.category = c.id AND s.live=1 AND s.company='$company' 
WHERE c.company='$company'
AND c.live=1 
ORDER BY c.name, s.name

关键部分是join on 子句,它可以任意复杂,在s.live=1 的示例中不必是真正的“连接”谓词(即不必比较表之间的值 - 它们可以只是对行本身的测试):

LEFT JOIN snippets AS s ON s.category = c.id AND s.live=1 AND s.company='$company' 

请注意,某些数据库(例如 mysql)允许您的原始语法仍然按需要工作。

EDITED 也将 s.company='$company' 移到 on 子句中。谢谢@Andriy

【讨论】:

  • 我同意您总结问题核心的方式,但您查询中的 WHERE 子句实际上仍包含右侧表的条件 (s.company='$company')。
  • @Andriy Oh - 没注意到。我也要把它搬进去!
  • 谢谢,波西米亚和@Andriy。查询现在可以按我的需要工作,而且我知道怎么做!干杯,伙计们。
【解决方案2】:

使用 RIGHT JOIN 会得到相同的结果吗?

【讨论】:

    【解决方案3】:

    如果您想要完美匹配,则需要 Inner Join。如果您想要左侧的所有行以及右侧和左侧的所有行具有相同的 id,则需要左连接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-02
      • 1970-01-01
      相关资源
      最近更新 更多