use*_*997 7 mysql sql join subquery
我有两个表,类别和图像.这里,Category.ID == Images.Category
类别
-----------------------
| ID | parent | name |
-----------------------
| 1 | 1 | foo |
| 2 | 1 | bar |
| 3 | 2 | lorem |
-----------------------
Run Code Online (Sandbox Code Playgroud)
图片
--------------------------------------
| ID | category | url |
--------------------------------------
| 1 | 1 | foo.jpg |
| 2 | 2 | bar.jpg |
| 3 | 1 | foo2.jpg |
--------------------------------------
Run Code Online (Sandbox Code Playgroud)
我试过MySQL Query
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'
Run Code Online (Sandbox Code Playgroud)
结果如何
-------------------------------------------
| ID | parent | name | url | max(ID) |
-------------------------------------------
| 1 | 1 | foo | foo.jpg | 3 |
| 2 | 1 | bar | bar.jpg | 2 |
-------------------------------------------
Run Code Online (Sandbox Code Playgroud)
问题是
我想在这里添加最后一行的url,但是在第一行中,而不是url = foo2.jpg和max(ID)= 3,它会产生foo.jpg.我无法弄清楚查询中的问题.
我使用max(ID)获取最后一行,它为max(ID)提供了正确的最后一行,但没有给出合适的url列.
Mah*_*mal 12
试试这个:
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';
Run Code Online (Sandbox Code Playgroud)
问题在于,您GROUP BY category在子查询中并选择MAX(ID) , url, category了未包含在聚合函数和GROUP BY子句中的子查询,因此MySQL会为这些列选择一个任意值.这就是为什么你得到一致的结果.
为了解决这个问题,JOIN这两个表category和images正常,然后添加表之间的额外连接images和子查询其计算MAX(id)与GROUP BY category同一个表images.然后将此子查询与images连接条件上的表连接,即max id=到原始id.
这将只为您提供最后一个的图像细节id.