为什么我不能在MySQL的子查询中使用元组或有序对?

时间:2015-11-21 02:32:47

标签: mysql subquery tuples

假设我想在一个包含不同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对此如此笨重?它已经存在了几十年,并且没有人曾经实现过这种基本的东西?)

1 个答案:

答案 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我会感到惊讶,如果它得到了很多关注。