来自两个表的MySql复杂查询

时间:2012-12-12 07:25:10

标签: mysql sql select join

我有两个表“USERS”和“CALENDER”,在日历表用户中可以看到他的可用日期,意味着1对多的关系。

现在我希望按可用日期获取用户列表(今天可用于今天的日期),即:我想显示今天在顶部可用的用户,然后是那些将来可用的用户,然后显示这些用户谁没有任何可用性(即:没有日历记录)。

我正在尝试以下查询:

SELECT u.first_name, c.date
FROM  users AS u
LEFT JOIN calendar AS c ON (c.uid = u.id)
GROUP BY u.id
ORDER BY DATE(c.date) ASC

但是这会让我记录那些在日历中没有任何可用性的用户,然后是那些在过去有可用性的用户。结果如下:

User1   NULL                                          User13    2012-12-12 00:00:00
User2   NULL                                          User12    2012-12-12 00:00:00
User3   NULL                                          User10    2012-12-23 00:00:00                      
User4   NULL                                          User10    2012-12-24 00:00:00
User5   NULL                                          User9     2012-12-25 00:00:00
User6   NULL                 - Want To look this =>   User8     2012-12-27 00:00:00
User7   2012-09-20 00:00:00                           User7     2012-12-28 00:00:00
User8   2012-09-29 00:00:00                           User1     NUL
User9   2012-10-25 00:00:00                           User2     NUL
User10  2012-10-26 00:00:00                           User3     NUL
User11  2012-10-27 00:00:00                           User4     NUL
User12  2012-12-05 00:00:00                           User5     NUL
User13  2012-12-10 00:00:00                           User6     NUL

4 个答案:

答案 0 :(得分:1)

使用

修改ORDER BY子句
ORDER BY IF(DATE(c.date) IS NULL, 1, 0), DATE(c.date)

答案 1 :(得分:1)

如果没有考虑过这个问题,您是否尝试过使用

来反转排序顺序
... ORDER BY DATE(c.date) DESC

DESC结尾,而不是显式(和默认)ASC结尾。

答案 2 :(得分:0)

使用IF函数将空值映射到其他可根据需要排序的值,例如:过去的日期,如果适合你的话,甚至是字符串。

http://www.java2s.com/Code/SQL/Function/MappingNULLValuestoOtherValuesforDisplay.htm

答案 3 :(得分:0)

这个问题可以通过放置子查询并获取未来日期来解决,然后以升序形式显示完全相同的问题,即:所有可用日期记录在顶部然后是一些未来记录然后显示空值(如果某人在日历上没有约会。)

SELECT u.first_name, 
 (
  SELECT DATE( c.date ) FROM calendar AS c
  WHERE c.uid = u.id
  AND DATE( c.date ) >= CURDATE( )
  ORDER BY DATE( c.date ) ASC
  LIMIT 1
) AS availability
FROM users AS u
GROUP BY u.id
ORDER BY IF( availability IS NULL , 1, 0 ) , availability