mysql - 查找其他两列中每个唯一值出现的最小值

标签 mysql

给出以下(简化的)表格:

p

id  name    registered
-----------------------------------
1   Geoff   2011-03-29 12:09:08
2   Phil    2011-04-29 09:03:54
3   Tony    2011-05-29 21:22:23
4   Gary    2011-06-21 22:56:08
...

项目i

date                        p1id    p2id    
----------------------------------------
2011-06-29 20:09:44         1       2
2011-06-26 10:45:00         1       3
2011-06-23 12:22:43         2       3
2011-06-22 13:07:12         2       4
...

我想要: 每个p.id出现在p1idp2id<任一列中的最早的单个i.date/;或p.registered(如果两者都不包含)。

到目前为止,我已经尝试过:

CREATE TEMPORARY TABLE temp (id INT);
INSERT INTO temp (id) 
    SELECT DISTINCT u FROM (
        SELECT p1id AS u FROM Items UNION ALL 
        SELECT p2id AS u FROM Items
    )tt;
SELECT registered,id FROM People 
    WHERE id NOT IN (SELECT id FROM temp);

这让我到达了第二部分,尽管方式相当笨拙;除了通过 p.id 的所有值进行某种外部脚本化迭代之外,我还停留在第一部分(呃)。

有人可以帮忙吗?

我使用的是 MySQL 5.1,有大约 20k 人和大约 100k 项。

最佳答案

另一种解决方案:

SELECT id, name, IF(min_date1 IS NULL AND min_date2 IS NULL, registered, LEAST(COALESCE(min_date1, min_date2), COALESCE(min_date2, min_date1))) date FROM (
  SELECT p.id, p.name, p.registered, MIN(i1.date) min_date1, MIN(i2.date) min_date2 FROM people p
    LEFT JOIN items i1
      ON p.id = i1.p1id
    LEFT JOIN items i2
      ON p.id = i2.p2id
  GROUP BY id
) t;

或者这个:

SELECT p.id, p.name, COALESCE(MIN(i.date), p.registered) FROM people p
  LEFT JOIN (
    SELECT p1id id, date FROM items
      UNION ALL
    SELECT p2id id, date FROM items
  ) i
  ON p.id = i.id
GROUP BY id;

结果:

+------+-------+---------------------+
| id   | name  | date                |
+------+-------+---------------------+
|    1 | Geoff | 2011-06-26 10:45:00 |
|    2 | Phil  | 2011-06-22 13:07:12 |
|    3 | Tony  | 2011-06-23 12:22:43 |
|    4 | Gary  | 2011-06-22 13:07:12 |
+------+-------+---------------------+

关于mysql - 查找其他两列中每个唯一值出现的最小值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6532764/

相关文章:

mysql - 如何使用order by按当前日期排序?

MYSQL 查询按月分割

php - 通过 JSON 将分隔字符串发送到 PHP 以获取准备好的语句

mysql - 如何获取多列不同值并且每个不同字段具有相同的反向数据

MySQL返回具有最小计数的ID

php - 添加的数据仅在重新启动 Internet Explorer 后显示

mysql - SQL 左连接 : how to return the newest from tableB and grouped by another field

php - 在shell中接收select的结果

php - 如何对从 MySQL 调用的 HTML 表行进行排序

mysql - 如何更改 MySQL 中的自动增量计数器?