mysql - 如何按子查询结果排序

标签 mysql sql mariadb

我有 2 个数据库表,EventsEvent_Dates,因此每个事件可以有多个日期。我现在尝试读出下一个即将发生的事件以及按日期排序的所有即将发生的事件的列表。

因此,我使用子查询创建了以下查询,但排序依据被忽略。经过一些研究,我意识到这是常见的,但我仍然不确定如何解决这个问题。有人可以给我提示吗?

我的事件表存储事件信息,如位置事件名称描述Event_Dates 表存储 event_id 以及一个或多个日期(如果事件持续超过 1 天)。我

如果我只是检查我的子查询,那么我会得到 event_date 的正确顺序,但主查询会忽略 event_dates 的顺序。因此,如果我的事件日期表中有以下内容

id | event_id | event_date
1  | 58 | 2019-02-23
2  | 59 | 2019-02-24
3  | 60 | 2019-02-09 

子查询返回 605859 这是正确的,所以我想按该顺序显示事件,但相反显示 585960

Select * FROM events WHERE id in(
 select event_id from event_dates 
    where event_date >= NOW() order by ABS(DATEDIFF(NOW(),event_date))
)

更新-

出色而快速的帮助让我找到了解决方案,这就是它在 Laravel 中的样子:

         $events = Event::select('events.*')
                ->distinct('events.id')
                ->join('event_dates','event_dates.event_id','=','events.id')
                ->where('event_date', '>=', \DB::raw('curdate()'))  
                ->where('published',1)    
                ->orderBy('event_dates.event_date')   
                ->get();

最佳答案

您有重复发生的事件。一个事件可以在过去发生多次,也可以在将来发生多次。您想要显示按日期排序的 future 事件。这只是一个内部联接:

select e.*
from events e 
join event_dates ed on ed.event_id = e.id and ed.event_date >= now()
order by ed.event_date;

通过 2017 年、2018 年、2019 年、2020 年的圣诞节和复活节事件,您将获得:

Easter
Christmas
Easter
Christmas

关于mysql - 如何按子查询结果排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54601724/

相关文章:

php - 如何在sql中用group concat连接三个表

mysql - 为什么MySQL中DISTINCT必须放在第一位?

mysql - Percona xtrabackup

mysql - 在 mariadb 中,replace 只触发一个触发器

php - 在多行查询上执行 mysql_real_escape_string 时出现 MySQL 错误

amazon-ec2 - 尝试将本地 mysql 服务器迁移到 AWS

ruby-on-rails - MySql Query::当查询被触发时,如何解决数据中的 's 问题

sql - 使用 Join 选择数据

c# - 无法识别 mysql 请求中的问题

mysql - 在 mysql/mariadb 中转换为签名的smallint