MySQL INNER JOIN查询中存在子查询问题

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)

SQL小提琴演示

问题在于,您GROUP BY category在子查询中并选择MAX(ID) , url, category了未包含在聚合函数和GROUP BY子句中的子查询,因此MySQL会为这些列选择一个任意值.这就是为什么你得到一致的结果.

为了解决这个问题,JOIN这两个表categoryimages正常,然后添加表之间的额外连接images和子查询其计算MAX(id)GROUP BY category同一个表images.然后将此子查询与images连接条件上的表连接,即max id=到原始id.

这将只为您提供最后一个的图像细节id.