按联接表中最近的日期排序,其中where条件 - MySQL

时间:2014-10-17 11:27:30

标签: mysql sql date join left-join

你好!

我有这两个表:

     1.events                             2.eventdates 
+------------------+         +---------------------------------------+
| id |    title    |         | id | event_id |    date    | bookable |
+------------------+         +---------------------------------------+
| 1  |   event1    |         | 1  |     1    | 2010-03-25 |     1    |
| 2  |   event2    |         | 2  |     1    | 2012-02-20 |     1    |
| 3  |   event3    |         | 3  |     2    | 2014-12-15 |     1    |
+------------------+         | 4  |     2    | 2014-10-28 |     1    | <
                             | 5  |     2    | 2014-10-24 |     0    |
                             | 6  |     3    | 2014-11-30 |     1    | <
                             | 7  |     3    | 2014-06-17 |     1    |
                             | 8  |     1    | 2014-12-25 |     0    |
                             +---------------------------------------+

目的:

目标是通过下一个可用的显示每个事件(ORDER BY):

  • 他的下一个日期(如果存在且可预订)
  • 如果没有相应的结果则为空

如果今天是2014-10-17,它应该是这样的:

'event2', '2014-10-28'
'event3', '2014-11-30'
'event1', '' (or NULL)

-

我真的需要在同一个查询中,因为我想对事件使用分页。 这就是我在使用php查询后无法对数据进行排序的原因...

由于WHERE bookable从查询中排除了事件1,因此我无法使用简单的左连接。

我也尝试使用子查询,但我无法获得每个事件的下一个日期。

-

有人有想法或查询我可以测试以获得所需的结果吗?

感谢所有帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

SELECT e.title, d.date
  FROM events e
  LEFT JOIN (
    SELECT event_id, MIN(date) AS date
      FROM eventdates
      WHERE date >= DATE(NOW()) AND bookable = 1
      GROUP BY event_id
  ) d ON d.event_id = e.id
ORDER BY d.date

或者没有子查询:

SELECT e.title, MIN(d.date) AS date
  FROM events e
  LEFT JOIN eventdates d
    ON d.event_id = e.id
   AND d.date >= DATE(NOW())
   AND d.bookable = 1
GROUP BY e.id, e.title
ORDER BY date