Mysql 我的SQL唯一值-意外结果
我有一个表tblSchedule,下面是其中的值Mysql 我的SQL唯一值-意外结果,mysql,sql,select,group-by,sql-order-by,Mysql,Sql,Select,Group By,Sql Order By,我有一个表tblSchedule,下面是其中的值 INSERT INTO tblSchedule (`scheduleID`, `eventID`, `price`, `eventDate`) VALUES (1, 1, 150, '2013-04-20 00:00:00'), (2, 1, 100, '2013-04-15 00:00:00'), (3, 2, 80, '2013-04-18 00:00:00'), (4, 3, 120, '2013-04-26 00:00:00'), (
INSERT INTO tblSchedule (`scheduleID`, `eventID`, `price`, `eventDate`) VALUES
(1, 1, 150, '2013-04-20 00:00:00'),
(2, 1, 100, '2013-04-15 00:00:00'),
(3, 2, 80, '2013-04-18 00:00:00'),
(4, 3, 120, '2013-04-26 00:00:00'),
(5, 3, 140, '2013-04-22 00:00:00'),
(6, 2, 100, '2013-04-22 00:00:00');
我想获得由eventDate ASC排序的唯一事件我尝试了以下查询,但这给出了错误的价格值和正确的事件日期
SELECT MIN(eventDate) as minEventDate, eventId, price
FROM tblSchedule
GROUP BY eventID
ORDER BY minEventDate
有谁能告诉我这里发生了什么以及正确查询的详细情况吗?首先,您应该为每个
eventID
找到MIN(EventDate)
,然后使用JOIN从原始表中找到包含这些eventID
和MIN(EventDate)
的行
SELECT * FROM tblSchedule
JOIN
( SELECT MIN(eventDate) as minEventDate,
eventId
FROM tblSchedule
GROUP BY eventID
) as T on tblSchedule.eventID=t.EventId
AND
tblSchedule.eventDate=t.minEventDate
ORDER BY eventDate
您可以为此使用时间戳
SELECT * FROM `tblschedule` ORDER BY TIMESTAMP( eventDate )
或
而不是*您可以放置任何要返回的列
试试这个:
SELECT eventDate, eventId, price
FROM (SELECT eventDate, eventId, price
FROM tblSchedule
ORDER BY eventId, eventDate
) AS A
GROUP BY eventId;
检查
输出
| EVENTDATE | EVENTID | PRICE |
|------------------------------|---------|-------|
| April, 15 2013 00:00:00+0000 | 1 | 100 |
| April, 18 2013 00:00:00+0000 | 2 | 80 |
| April, 22 2013 00:00:00+0000 | 3 | 140 |
为什么我们必须进行如此复杂的SQL查询以获得更简单的结果?它不应该自动将日期行与价格同步吗?这并不是那么复杂。它实际上非常简单明了。@MasoodAnwar:您按
eventId
分组,并为每个eventId
找到MIN(eventDate)
,但为什么您认为price
将来自同一行,而eventDate
最小?如您所知,price
可以来自不同的行。所以实际上你可以把它看作是一个完全随机选择的行。例如,MSSQL和Oracle中不允许使用更多此类按语法分组(当您可以在“选择而不聚合”中使用price
字段时)。谢谢Valex!这帮了大忙。为了澄清问题,您希望获得每个eventID
的最新price
和eventDate
,还是最旧的?
| EVENTDATE | EVENTID | PRICE |
|------------------------------|---------|-------|
| April, 15 2013 00:00:00+0000 | 1 | 100 |
| April, 18 2013 00:00:00+0000 | 2 | 80 |
| April, 22 2013 00:00:00+0000 | 3 | 140 |