MySQL INNER JOIN 查询中包含子查询的问题
Posted
技术标签:
【中文标题】MySQL INNER JOIN 查询中包含子查询的问题【英文标题】:Having issue with MySQL INNER JOIN query having sub-query in it 【发布时间】:2013-03-09 03:46:47 【问题描述】:我有两个表,类别和图像。这里,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 列。
【问题讨论】:
【参考方案1】:试试这个:
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
通常使用两个表 category
和 images
,然后在表 images
和计算 MAX(id)
和 GROUP BY category
的子查询之间为同一个表添加一个额外的连接images
。然后在最大id
= 到原始id
的连接条件下将此子查询与表images
连接起来。
这将只为您提供最后一个id
的图像详细信息。
【讨论】:
@user1995997 - 随时欢迎您。有关此问题的更多信息,请参阅我的编辑。 现在我明白了。感谢您如此出色的回应。【参考方案2】:以更短的方式
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 fiddle 测试过......用这个链接。 http://sqlfiddle.com/#!2/5fe63/36
如果解决了请告诉我
【讨论】:
两个表之间的连接是 Category.ID == Images.Category。是的,这种模式也可以,谢谢你的回答。以上是关于MySQL INNER JOIN 查询中包含子查询的问题的主要内容,如果未能解决你的问题,请参考以下文章
Mysql 连接(left join, right join, inner join ,full join)
mysql的unionleft join right join inner join和视图学习
在 JPA 的 SQL 查询中的 FROM 语句中包含子查询