使用group by时返回按ID排序的最新行

时间:2014-01-22 15:09:56

标签: mysql sql group-by subquery

我有2个表,A和B包含一些数据,例如

   TABLE A                 TABLE B
+----+-------+     +----+------+--------+
| id | title |     | id | a_id | status |
+----+-------+     +----+------+--------+
|  1 | apple |     |  1 |    1 |      0 |
|  2 |  eggs |     |  2 |    1 |      1 |
+----+-------+     |  3 |    1 |      2 |
                   |  4 |    1 |      3 |
                   |  5 |    1 |      0 |
                   |  6 |    1 |      1 |
                   |  7 |    2 |      0 |
                   |  8 |    2 |      1 |
                   |  9 |    2 |      2 |
                   | 10 |    1 |      0 |
                   | 11 |    1 |      3 |
                   +----+------+--------+

我想从表A中选择水果并加入表B并获取最新状态记录(按ID)。

我的桌子包含大约10k的水果和100 + k的状态。

所以结果看起来像

+------+---------+------+--------+----------+
| a.id | a.title | b.id | b.a_id | b.status |
+------+---------+------+--------+----------+
|    1 |   apple |   11 |      1 |        3 |
|    2 |    eggs |    9 |      2 |        2 |
+------+---------+------+--------+----------+

我可以像这样使用sql脚本进行分组

SELECT * FROM a LEFT JOIN b ON a.id = b.a_id GROUP_BY a.id

但它从表B得到第一项,因此结果不正确。

2 个答案:

答案 0 :(得分:2)

您可以使用substring_index() / group_concat()技巧:

select a.title,
       substring_index(group_concat(status order by id desc), ',', 1) as laststatus
from b join
     a
     on a.id - b.a_id
group by a.title;

编辑:

如果你只想要b中的 last 记录,你可以这样做:

select a.title, b.status
from b join
     a
     on a.id - b.a_id
order by b.id desc
limit 1;

答案 1 :(得分:0)

b.id

订购的所有产品
SELECT * 
FROM a
INNER JOIN b
ON a.ID = b.A_ID
ORDER BY b.ID desc;

只需1个注册。

SELECT * FROM A
INNER JOIN B
ON A.ID = B.A_ID
WHERE A.ID = (select max(B.A_ID) from B);