gpt4 book ai didi

mysql - 使用 MySQL 查询进行复杂排序

转载 作者:行者123 更新时间:2023-11-29 07:08:46 24 4
gpt4 key购买 nike

我在处理需要一些“复杂”排序的 Mysql 查询时遇到了问题。我有 2 个表:

Training
+--------------+------------------+
| training_id | training_name |
+--------------+------------------+
| 1 | test1 |
| 2 | test2 |
| 3 | test3 |
+--------------+------------------+

Training_venue
+----------+--------------+------------+
| venue_id | training_id | venue_date |
+----------+--------------+------------+
| 1 | 2 | 2009-06-01 |
| 2 | 2 | 2012-06-01 |
| 3 | 2 | 2011-06-01 |
| 4 | 1 | 2009-09-01 |
| 5 | 1 | 2011-09-01 |
| 6 | 1 | 2012-09-01 |
| 7 | 3 | 2009-01-01 |
+----------+--------------+------------+

我期待以下结果:

+--------------+------------------+------------+--------------+
| training_id | training_name | venue_id | venue_date |
+--------------+------------------+------------+--------------+
| 2 | test2 | 2 | 2011-06-01 |
| 2 | test2 | 3 | 2012-06-01 |
| 1 | test1 | 6 | 2011-09-01 |
| 1 | test1 | 5 | 2012-09-01 |
+--------------+------------------+------------+--------------+

可以看到,结果要求是:

  • 丢弃没有 future field 的训练。
  • 过期 field 被丢弃
  • 培训“分组”在一起
  • 最早 field 的训练在前,“最新最快 field ”的训练在最后
  • 在培训中, field 是从早到晚排序的。

什么 mysql 查询将返回该结果集?

编辑:到目前为止,这是我尝试过的:

SELECT *
FROM `training` AS t
LEFT JOIN `training_venue` AS v USING ( `training_id` )
WHERE `venue_date` >= NOW()
ORDER BY `training_id;

但是如果按 training_id 的顺序负责将所有训练“分组”在一起,则不允许从最快地点的训练到最新地点的训练排序。

我还编辑了数据表来说明这个问题。查看结果是如何排序的,不是按training_id,而是按最快地点。

编辑:更正了日期。

最佳答案

SELECT t1.training_id, t1.training_name, t2.venue_id, t2.venue_date
FROM Training t1
INNER JOIN Training_venue t2 ON t1.training_id = t2.training_id
WHERE t2.venue_date >= NOW()
ORDER BY t1.training_id ASC, t2.venue_date ASC

我不知道你最后的意思是什么:“在培训中, field 是从最快到最晚订购的。”但上面的查询似乎符合您的其余需求。

编辑:我现在有点理解你在追求什么。我认为这有点复杂。我会再考虑一下。

编辑:我想我有!

SELECT t1.training_id, t1.training_name, t2.venue_id, t2.venue_date 
FROM Training t1
INNER JOIN (SELECT training_id, venue_date
FROM training_venue
WHERE venue_date >= NOW()
GROUP BY training_id
ORDER BY MIN(venue_date)) t3 ON t1.training_id = t3.training_id
INNER JOIN Training_venue t2 ON t1.training_id = t2.training_id
WHERE t2.venue_date >= NOW()
ORDER BY t3.venue_date DESC, t2.venue_date ASC

试试吧!

编辑:使用“2010-01-01”而不是 NOW() 因为 NOW() 会丢失您似乎想要包含的 2010 年日期。

关于mysql - 使用 MySQL 查询进行复杂排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5820579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com