如果我可以从MySQL数据库中的表中检索每个name
的最新id
,如下所示:
SELECT n.id, n.name, n.date
FROM $table AS n
INNER JOIN
(SELECT id, MAX(date) AS date
FROM $table GROUP BY id)
AS max
USING (id, date);
如何从三个几乎相同的表(称为name
)中检索最新的$table, $table2, $table3
?它们都共享相同的列结构,并且从一个表中找到的id
可能会也可能不会出现在另外两个表中。可以把它想象成一个分成三个的大表(但是其中两个包含两个在这个例子中无关的额外列)。 UNION
会是最好的解决方案吗?如果是这样,有没有办法在没有一英里长的查询的情况下做到这一点?
约束:
不幸的是,id不是自动递增的唯一整数
答案 0 :(得分:1)
您可以使用union all
。一个简单的简化是group_concat()
/ substring_index()
技巧:
select id, max(date) as date,
substring_index(group_concat(name order by date desc), ',', '') as MostRecentName
from (select t.* from $table1 t union all
select t.* from $table2 t union all
select t.* from $table3
) t
group by id;
这确实做出了某些假设。 name
不能包含,
(虽然更改分隔符很容易。此外,group_concat()
的中间结果不能超过某个阈值(由用户决定 - 可设置的系统参数)。
答案 1 :(得分:0)
你可以尝试:
SELECT n.id, n.name, n.date
FROM table1 where id in (select max(id) from table1)
union
SELECT n.id, n.name, n.date
FROM table2 where id in (select max(id) from table2)
union
SELECT n.id, n.name, n.date
FROM table3 where id in (select max(id) from table3)
每个内部查询从表中选择最高的id,然后在外部查询中搜索相应的字段。
答案 2 :(得分:0)
这最终成为我能想到的唯一解决方案:
SELECT n.id, n.name, n.date FROM (
SELECT id, name, date FROM $table
UNION ALL
SELECT id, name, date FROM $table2
UNION ALL
SELECT id, name, date FROM $table3
) AS n INNER JOIN (
SELECT id, MAX(date) AS date FROM (
SELECT id, date FROM $table
UNION ALL
SELECT id, date FROM $table2
UNION ALL
SELECT id, date FROM $table3
) AS t
GROUP BY id
) AS max USING (id, date)