我有两个表“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
答案 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