假设我想在一个包含不同ID记录的表中获取最新行。
首先,我创建一个临时表,在那里我找到最新的行(当然按ID分组):
CREATE TEMPORARY TABLE
temp1
AS
SELECT DISTINCT ID, max(date) FROM atable GROUP BY ID;
但是,由于重点是获取这些记录的所有值,我必须将其加入原始表atable
。很烦人,但你能做些什么。
我真的,真的想要使用元组或订单对。为什么我不能在MySQL中这样做?
SELECT * FROM atable
WHERE (ID, date) IN
(SELECT ID, date FROM temp1);
执行此操作的规范语法是什么?
(此外,哲学问题:为什么MySQL对此如此笨重?它已经存在了几十年,并且没有人曾经实现过这种基本的东西?)
答案 0 :(得分:0)
为什么我不能在MySQL中这样做?
您可以,但不能使用IN
。匹配多列的方法是使用EXISTS
:
SELECT * FROM atable
WHERE EXISTS
(SELECT NULL FROM temp1
WHERE temp1.ID = atable.ID AND temp1.date = atable.date);
请注意,您也可以将原始查询用作子查询:
SELECT * FROM atable
WHERE date = (SELECT max(date) FROM atable WHERE ID = atable.ID)
为什么MySQL如此笨重呢?
"标准"使用IN
是为了找到一个值包含在其他值列表中的记录(例如WHERE NAME IN ('Smith', 'Jones')
。这已被扩展为允许子查询提供列表而不是静态列表。
如果您觉得它是MySQL的一个有价值的功能(并且您似乎认为它非常简单)那么您可以提交feature request,但从1开始,还有另一个完成它的方法和2)它将是非标准的SQL我会感到惊讶,如果它得到了很多关注。