我有两张桌子,类别和图片。这里,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列。
答案 0 :(得分:9)
请改为尝试:
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';
问题是,你在子查询中是GROUP BY category
并且选择了MAX(ID) , url, category
,它们没有包含在聚合函数中,也没有包含在GROUP BY
子句中,所以MySQL选择了一个任意值对于这些列。这就是为什么你得到一致的结果。
要解决此问题,通常会JOIN
两个表category
和images
,然后在表images
和计算{{1}的子查询之间添加额外的连接同一个表MAX(id)
使用GROUP BY category
。然后在最大images
=原始images
的连接条件下将此子查询与表id
连接起来。
这只会为您提供上一个id
的图像详细信息。
答案 1 :(得分:1)
以更短的方式
SELECT c.id,c.parent,c.name, MAX(c.ID) , url, category
FROM `category` c
INNER JOIN Images i on c.id=i.id and
c.id=(select max(id) from category)
我认为这个查询对你有用..用sql小提琴测试......用这个链接。 http://sqlfiddle.com/#!2/5fe63/36
让我知道如果解决了