在加入中使用Max()

时间:2014-05-02 15:08:57

标签: mysql max left-join

这是我需要的一种查询。但由于在连接中使用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)

4 个答案:

答案 0 :(得分:1)

MAX()函数是一个聚合:它只在所有JOINWHERE子句执行后运行。相反,将其作为子查询分解,因此它运行一次,并在外部查询的其余部分之前运行:

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)