9

我有两个表,类别和图像。在这里,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 列。

4

2 回答 2

14

试试这个:

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 小提琴演示

问题是,您GROUP BY category在子查询和选择MAX(ID) , url, category中,它们既没有包含在聚合函数中,也没有包含在GROUP BY子句中,因此 MySQL 为这些列选择了任意值。这就是为什么你得到一致的结果。

为了解决这个问题,JOIN这两个表通常,然后在表category和一个子查询images之间添加一个额外的连接,该images子查询计算MAX(id)GROUP BY category一个表的images。然后在 max = 到 originalimages的连接条件下将此子查询与表连接起来。idid

这将只为您提供最后的那些图像细节id

于 2013-03-20T06:44:50.623 回答
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 fiddle 测试过......用这个链接。 http://sqlfiddle.com/#!2/5fe63/36

让我知道是否解决了

于 2013-03-20T07:09:59.397 回答