SQL LEFT JOIN问题

标签 sql mysql greatest-n-per-group

我正在尝试选择最新的 updated(字段)pages(表格),排除隐藏的页面(visible = "n").但是,我想按 slug 对页面进行分组,因此每个 slug 只能得到一个结果。

下面的查询有点有效,但它只为每个 slug 选择最新更新的页面 — 然后,如果该页面恰好被隐藏,它会将其从结果中删除 :( 在这种情况下,我只想获取最新更新的页面,其中包含 可见的 slug。

SELECT `p1`.`id` AS `pID`, `p1`.`slug` AS `url`, `p1`.`revision`, `p1`.`title`, `p1`.`published`, `p1`.`updated`, (SELECT COUNT(*) FROM `pages` WHERE `slug` = `url` AND `visible` = "y") AS `revisionCount`, (SELECT COUNT(*) FROM `tests` WHERE `pageID` = `pID`) AS `testCount`
FROM `pages` `p1`
LEFT JOIN `pages` `p2` ON `p1`.`slug` = `p2`.`slug` AND `p1`.`updated` < `p2`.`updated`
WHERE `p2`.`updated` IS NULL AND `p1`.`visible` = "y"
ORDER BY `p1`.`updated` DESC

最佳答案

这是 GROUP BY 的经典案例。因为在您的情况下您甚至不希望页面被考虑 除非它是“可见的”,您将使用 WHERE 子句而不是 HAVING 子句。

SELECT MAX(id) as highest_id_for_slug, slug
FROM pages
GROUP BY slug 
WHERE visible = 'y'

您可以在子查询中使用它,如果您想将这些 ID 连接到页面表,或添加其他字段 - 请记住 SELECT 列表中的每一列都必须在 GROUP BY 中的规则,或者有一个聚合应用于它。

SELECT * FROM pages WHERE pages.id IN (
  SELECT MAX(id) as highest_id_for_slug
  FROM pages
  GROUP BY slug 
  WHERE visible = 'y'
)

关于SQL LEFT JOIN问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3410626/

相关文章:

sql - 如何为每个 ID 选择前 2 个值

sql - Oracle SQL,如何选择组中的第一行?

sql - 使用来自另一个表的唯一值创建一个表

php - 使查询更高效(查询速度真的很慢!)

java - Oracle 默认按行为排序

javascript - SQL - 选择具有默认值的时间段上的数据

mysql - 在sql中按组排序

sql - 基于一列具有唯一值的频率的缺乏而对一列进行不同计数

Java连接池(JNDI)半天后不起作用

php - Joomla eventlist函数中的多个mysql查询