【问题标题】:Having issue with MySQL INNER JOIN query having sub-query in itMySQL INNER JOIN 查询中包含子查询的问题
【发布时间】: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 列。

【问题讨论】:

    标签: mysql sql join subquery


    【解决方案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 通常使用两个表 categoryimages,然后在表 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。是的,这种模式也可以,谢谢你的回答。
    猜你喜欢
    • 1970-01-01
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多