这是我需要的一种查询。但由于在连接中使用MAX()函数,我一直收到错误。如何使用此逻辑编写有效查询?
编辑:我更新了我的查询,但没有返回错误。但是,这有一个逻辑错误。如果image.sort_index = -1,我不想要最大排序索引。如果image.sort_index = -1,我如何打破布尔条件检查?以下是更新的查询
SELECT
albums.ID, albums.title, images.ID AS thumb_id, images.image_count as image_count
FROM
`albums`
LEFT JOIN
(
SELECT
ID, album_id, sort_index,
MAX(sort_index) AS max_sort_index,
COUNT(ID) as image_count
FROM
`images`
GROUP BY album_id
)
ON images.album_id = albums.ID
AND
(images.sort_index = -1 OR images.sort_index = images.max_sort_index)
答案 0 :(得分:1)
MAX()
函数是一个聚合:它只在所有JOIN
和WHERE
子句执行后运行。相反,将其作为子查询分解,因此它运行一次,并在外部查询的其余部分之前运行:
SELECT
albums.*, images.ID as album_thumb
FROM
`albums`
LEFT JOIN `images` ON
images.album_id = albums.ID
AND
(images.sort_index = -1 OR images.sort_index = (
SELECT MAX(sort_index) FROM images
)
)
缺点是,如果您希望在WHERE
范围内对外部查询进行任何其他限制(images
子句),则还需要在子查询中复制它们。这是SQL的限制。
答案 1 :(得分:0)
LEFT JOIN `images` ON
images.album_id = albums.ID
AND (images.sort_index = -1 OR images.sort_index = (SELECT MAX(images.sort_index) FROM images))
MAX是一个聚合函数,在这种情况下,需要放在子查询中以获得您正在寻找的结果
答案 2 :(得分:0)
试试这个
SELECT
albums.*, images.ID as album_thumb
FROM
`albums`
LEFT JOIN
`images` ON images.album_id = albums.ID
WHERE
images.sort_index = -1 OR images.sort_index = (select MAX(tmp.sort_index) from images tmp)
答案 3 :(得分:0)
我终于有了一个解决方案,我会发布这个解决方案以防其他人遇到同样的问题。此答案中包含其他字段,以显示此解决方案的广泛范围。
SELECT albums.*, tbl2.ID as thumb_id
FROM albums
LEFT JOIN (
SELECT album_id,MIN(sort_index) min_sort, MAX(sort_index) as max_sort FROM images
GROUP BY album_id
) tbl ON tbl.album_id = albums.ID
LEFT JOIN images tbl2 ON tbl2.album_id = albums.ID AND
(tbl.min_sort = -1 AND tbl2.sort_index = -1) OR
(tbl.min_sort > -1 AND tbl2.sort_index = tbl.max_sort)