PHP MySQL按ASC/DESC顺序排序

3

表格:

**timeslot**:
----------
id_timeslot   times
1             09:00
2             09:30
3             10:00
4             10:30
5             11:00

**bookslot**
id   id_timeslot     date        b_ref
-------------------------------------------
1    2               2010-02-22  001 
2    3               2010-02-22  001
3    4               2010-02-22  001
4    5               2010-02-22  001
5    2               2010-02-25  002
6    3               2010-02-27  003
7    4               2010-02-27  003
8    5               2010-02-27  003

PHP

$q = $mysqli->query("SELECT * FROM bookslot  
LEFT JOIN timeslot ON bookslot.id_timeslot = timeslot.id_timeslot   
WHERE bookslot.status = 1 
GROUP BY bookslot.b_ref  
ORDER BY bookslot.date ASC, bookslot.id_timeslot ASC LIMIT 20");

HTML结果:
DATE         TIMES  
2010-02-22   10:30
2010-02-25   09:30
2010-02-27   11:00

有没有人注意到表格结果中时间顺序不正确?
我尝试使用ASC/DESC的方式更改,但时间仍显示最后一个id_timeslot。

期望的结果:

DATE         TIMES  
2010-02-22   09:30
2010-02-25   09:30
2010-02-27   10:00

据我所见,2010-02-22 10:302010-02-25 09:302010-02-27 11:00之前。 - Salman A
嗯,我找不到你想要实现的内容。但是 2010-02-27 不能与 10:00 关联,因为它的时间ID是 5,即 11:00... - Shikiryu
你的示例还缺少bookslot表中的状态列,尽管你在WHERE子句中使用了它。这可能与此有关吗? - Tarek Fadel
3个回答

3
你的GROUP BY bookslot.b_ref语句正在对记录进行分组,因此你只能看到每种情况下的最后一次时间。

尝试使用

SELECT date, time, MIN(bookslot.id_timeslot)
FROM bookslot  
LEFT JOIN timeslot ON bookslot.id_timeslot = timeslot.id_timeslot   
WHERE bookslot.status = 1 
GROUP BY bookslot.b_ref  
ORDER BY bookslot.date ASC, bookslot.id_timeslot ASC LIMIT 20

1

虽然您的SQL语法是正确的,但它会产生意想不到的结果。

通常情况下,您在GROUP BY子句中必须指定要SELECT的列,或者应该将其包含在聚合函数中。否则,MySQL将自行决定在GROUP BY操作中要消除哪些记录。 ORDER BY无关紧要,因为它是在GROUP BY操作之后应用的。您最好像这样修改查询:

SELECT b_ref, MIN(ADDTIME(date, times)) AS complete_datetime
FROM bookslot
LEFT JOIN timeslot ON bookslot.id_timeslot = timeslot.id_timeslot
WHERE bookslot.status = 1
GROUP BY bookslot.b_ref
ORDER BY bookslot.date, bookslot.id_timeslot

1

由于目标似乎是收集每个书槽的最早时间段,因此需要使用MIN来缩小结果范围。

SELECT b.id, b.id_timeslot, b.date, MIN(`date`) , t.times
FROM bookslot b
LEFT JOIN timeslot t ON b.id_timeslot = t.id_timeslot
GROUP BY b.b_ref

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接