我有两张桌子,分类和图片。这里,category.id==images.category
类别

-----------------------
| ID | parent | name  |
-----------------------
| 1  | 1      | foo   |
| 2  | 1      | bar   |
| 3  | 2      | lorem |
-----------------------

图像
--------------------------------------
| ID  | category    | url            |
--------------------------------------
| 1   | 1           | foo.jpg        |
| 2   | 2           | bar.jpg        |
| 3   | 1           | foo2.jpg       |
--------------------------------------

我试过mysql查询
SELECT *
FROM `category`
INNER JOIN
(SELECT MAX(ID) , url, category FROM `images` GROUP BY `category`)
AS a ON category.ID = a.category
WHERE `parent` = '1'

结果是
-------------------------------------------
| ID | parent | name  | url     | max(ID) |
-------------------------------------------
| 1  | 1      | foo   | foo.jpg | 3       |
| 2  | 1      | bar   | bar.jpg | 2       |
-------------------------------------------

问题是
我希望最后添加的行的url在这里,但和第一行一样,它不是url=foo2.jpg,而是max(id)=3,而是结果是foo.jpg。我无法在查询中找出问题。
我使用max(id)来获取最后一行,这为max(id)提供了正确的最后一行,但不是适当的url列。

最佳答案

请改为:

SELECT *
FROM `category`   AS c
INNER JOIN images AS i ON i.category = c.id
INNER JOIN
(
    SELECT  category, MAX(ID) AS MAXId
    FROM `images`
    GROUP BY `category`
)AS a  ON i.category = a.category
      AND i.ID       = a.MaxID
WHERE c.`parent` = '1';

SQL Fiddle Demo
问题是,您在子查询中选择了GROUP BY category,而MAX(ID) , url, category既没有包含在聚合函数中,也没有包含在GROUP BY子句中,所以mysql为这些列选择了任意值。这就是为什么你得到了一致的结果。
为了解决这个问题,JOIN这两个表categoryimages通常,然后在表images和子查询之间添加一个额外的连接,该子查询用MAX(id)计算同一个表GROUP BY categoryimages。然后在maximages=到原始id的联接条件下,使用表id联接此子查询。
这将只提供最后id的那些图像细节。

09-11 17:14
查看更多