Mysql 从多个表中选择最新的行
我有一个多表的查询,结果如下。然后我想按t.id分组。我知道我可以简单地使用group by t.id,但如何选择t.id的最新一行,即url tw5.jpg和创建时间10000004Mysql 从多个表中选择最新的行,mysql,max,Mysql,Max,我有一个多表的查询,结果如下。然后我想按t.id分组。我知道我可以简单地使用group by t.id,但如何选择t.id的最新一行,即url tw5.jpg和创建时间10000004 SELECT p.url,t.name,t.num_photo,t.id FROM photos AS p LEFT JOIN tag_maps AS tm ON p.id = tm.photo_id LEFT JOIN tags AS t ON t.id = tm.tag_id url
SELECT p.url,t.name,t.num_photo,t.id
FROM photos AS p
LEFT JOIN tag_maps AS tm ON p.id = tm.photo_id
LEFT JOIN tags AS t ON t.id = tm.tag_id
url created_time name num_photo id
assets/img/tags/tw1.jpg 1000001 my house 1 1
assets/img/tags/tw2.jpg 1000002 dog 1 2
assets/img/tags/tw3.jpg 1000003 taiwan 2 3
assets/img/tags/tw5.jpg 1000004 taiwan 2 3
这是我使用group by t.id时得到的结果
url created_time name num_photo id
assets/img/tags/tw1.jpg 1000001 my house 1 1
assets/img/tags/tw2.jpg 1000002 dog 1 2
assets/img/tags/tw3.jpg 1000003 taiwan 2 3
这就是我想要的
url created_time name num_photo id
assets/img/tags/tw1.jpg 1000001 my house 1 1
assets/img/tags/tw2.jpg 1000002 dog 1 2
assets/img/tags/tw5.jpg 1000004 taiwan 2 3
编辑
照片表
id url created_time
1 assets/img/tags/tw1.jpg 1000001
2 assets/img/tags/tw2.jpg 1000002
3 assets/img/tags/tw3.jpg 1000003
4 assets/img/tags/tw5.jpg 1000004
标签表
id name num_photo
1 my house 1
2 dog 1
3 taiwan 2
Tag_地图
id tag_id photo_id
1 1 1
2 2 2
3 3 3
4 3 4
编辑2:在没有看到每个表或表结构的示例数据的情况下,我猜测以下操作将起作用:
SELECT p.url,
created_time,
t.name,
t.num_photo,
t.id
FROM photos p
LEFT JOIN tag_maps AS tm
ON p.id = tm.photo_id
LEFT JOIN tags AS t
ON t.id = tm.tag_id
INNER JOIN
(
select max(created_time) MaxDate, t.id
FROM photos p
LEFT JOIN tag_maps AS tm
ON p.id = tm.photo_id
LEFT JOIN tags AS t
ON t.id = tm.tag_id
group by t.id
) d
on p.created_time = d.MaxDate
and t.id = d.id;
看
或者另一种编写方法是使用一个子查询,该子查询从tag_maps表按tag_id返回maxphoto_id,并在联接中使用该结果:
SELECT p.url,
created_time,
t.name,
t.num_photo,
t.id
FROM photos p
INNER JOIN
(
select max(photo_id) photo_id, tag_id
from tag_maps
group by tag_id
) AS tm
ON p.id = tm.photo_id
LEFT JOIN tags AS t
ON t.id = tm.tag_id
看
结果是:
| URL | CREATED_TIME | NAME | NUM_PHOTO | ID |
----------------------------------------------------------------------
| assets/img/tags/tw1.jpg | 1000001 | my house | 1 | 1 |
| assets/img/tags/tw2.jpg | 1000002 | dog | 1 | 2 |
| assets/img/tags/tw5.jpg | 1000004 | taiwan | 2 | 3 |
编辑1因为您的url不同,并且您需要maxid,那么您应该能够使用:
SELECT p.url,
t.name,
t.num_photo,
Max(t.id) id
FROM photos p
LEFT JOIN tag_maps AS tm
ON p.id = tm.photo_id
LEFT JOIN tags AS t
ON t.id = tm.tag_id
group by t.name, t.num_photo
OP:您可以使用子查询:
SELECT p.url,
t.name,
t.num_photo
FROM
(
select MAX(created_time) created_time, url, id
from photos
group by url, id
) AS p
LEFT JOIN tag_maps AS tm
ON p.id = tm.photo_id
LEFT JOIN tags AS t
ON t.id = tm.tag_id
如果照片表中的id值对于每一行都是唯一的,则可能需要使用以下选项:
SELECT p1.url,
t.name,
t.num_photo
FROM photos p1
inner join
(
select MAX(created_time) created_time, url
from photos
group by url
) AS p2
on p1.url = p2.url
and p1.created_time = p2.created_time
LEFT JOIN tag_maps AS tm
ON p1.id = tm.photo_id
LEFT JOIN tags AS t
ON t.id = tm.tag_id
好的,照片中的id是唯一的,所以我使用第二个id,但为什么必须在子查询中按url分组呢。还有没有办法不使用子查询或其他简单的方法?@vzhen如果你不使用“按url分组”,那么你只会返回一条记录,记录的最大创建时间是你想通过每个url来区分的。嗨,我只是想告诉你,我刚才犯了一个错误,它实际上不起作用。我编辑了我的问题,介意看一下吗?感谢advDoens不起作用,maxt.id似乎没有选择最新创建的\u时间。我再次编辑了我的问题以使其更加清晰。从查询中很难判断,您能否发布每个表的表结构和示例数据?