【问题标题】:Retrieve all columns in row with min date?检索具有最小日期的行中的所有列?
【发布时间】:2013-08-25 21:15:52
【问题描述】:

有没有办法在不使用自联接的情况下解决这样的问题?有什么方法可以使用 min() 函数?

我想为每组列 c1 和 c2 获取第一个水果条目。 (假设日期不能相同)

DROP TABLE IF EXISTS test;
CREATE TABLE test
(
    c1 varchar(25),
    c2 varchar(25),
    fruit varchar(25),
    currentTime Datetime
);
INSERT INTO test VALUES    
('a','b','pineapple','2013-01-28 20:50:00'),
('a','b','papaya','2013-01-28 20:49:00'),
('a','b','pear','2013-01-28 20:51:00'),
('a','c','peach','2013-01-28 18:12:00'),    
('a','c','plum','2013-01-28 20:40:00'),
('a','c','pluot','2013-01-28 16:50:00');

这是我当前的查询:

SELECT t2.* 
  FROM (SELECT c1,
               c2,
               MIN(currentTime) AS ct
          FROM test 
      GROUP BY c1, c2) as t1
  JOIN test t2
    ON t1.c1 = t2.c1 AND
       t1.c2 = t2.c2 AND
       t2.currentTime = t1.ct

这会产生每个 c1/c2 对的最早条目,但是有没有办法使用 min() 并避免自连接?

【问题讨论】:

  • 我不认为你可以只用 MIN 归档它而没有任何连接/子查询,因为 MIN 不能与查询的其余部分一起工作,所以 min 的结果来自它本身并且不影响查询本身的其余部分。

标签: mysql sql date min


【解决方案1】:
  SELECT c1,
         c2,
         currentTime AS ct
    FROM test
GROUP BY c1,c2 
HAVING MIN(ct)

或者,如果您也想获得fruit 列,请尝试:

  SELECT c1,
         c2,
         fruit,
         currentTime AS ct
    FROM test
GROUP BY c1,c2 
HAVING MIN(ct)

【讨论】:

  • 我也想获得“水果”专栏。当您包含该列时,这似乎不起作用。我想不出办法。
  • | a | b | papaya | 2013-01-28 20:49:00 | | a | c | pluot | 2013-01-28 16:50:00 |
【解决方案2】:

我不知道我是否理解你,但是:

SELECT * 
  FROM test 
 WHERE currentTime IN (SELECT MIN(currentTime) FROM test)

【讨论】:

  • OP 要求一个没有“自连接”的解决方案 - 您的答案有一个引用原始表的子查询 - 本质上是一个连接。
【解决方案3】:

答案是“是”。你可以通过聚合来做到这一点。关键是使用group_concat()/substring_index()的技巧来获得第一个果实:

select c1, c2,
       substring_index(group_concat(fruit order by currentTime), ',', 1) as fruit,
       min(currentTime)
from test
group by c1, c2;

这已经在您的 SQL Fiddle 上进行了测试。

【讨论】:

  • 哇,从来没有听说过那个。非常甜美,语法更简单。谢谢你。会投票给你,但需要更多的声誉。
【解决方案4】:

这个怎么样:

SELECT
    *
FROM
    test
ORDER BY
    currentTime
LIMIT
    1;

这对你的目的有用吗?

【讨论】:

    猜你喜欢
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-30
    • 1970-01-01
    相关资源
    最近更新 更多