MYSQL不合适的查询

时间:2016-10-26 18:59:55

标签: mysql

我有两个查询,他们的出来是不同的,但我想要的是如下:

我有两张桌子:

Subject:
-subject_id (Primary key)
-about
-details

feedback:
-id (Primary Key)
-subject_id (Foreign key)
-rating
-DateAndTime

以下是查询及其结果:

SELECT distinct about, details, subject.subject_id, round(AVG(rating),2) as Rating, 
        Max(DATE_FORMAT( DateAndTime, '%d-%m-%Y' )) as Date,
        Max(TIME_FORMAT( DateAndTime, '%h:%i:%s' )) as Time  
FROM `subject` , `feedback` 
WHERE subject.Subject_ID = feedback.Subject_ID 
GROUP BY about,details,subject_id
ORDER BY DateAndTime DESC

此查询中的输出是唯一的,详细信息,subject_id列和平均评级。但问题在于日期和时间。我想要为该结果输入的最后日期和时间,结果也包含但不是有序的。

以上查询的图片

first query's image

当我执行此查询时,它会提供完美的订单但评级会被修改

SELECT distinct about, details, subject.subject_id, round(AVG(rating),2) as Rating, 
        Max(DATE_FORMAT( DateAndTime, '%d-%m-%Y' )) as Date,
        Max(TIME_FORMAT( DateAndTime, '%h:%i:%s' )) as Time  
FROM `subject` , `feedback` 
WHERE subject.Subject_ID = feedback.Subject_ID 
GROUP BY about,details,subject_id,dateandtime  
ORDER BY DateAndTime,Time DESC

second query's image

区别仅在于分组条款。

所以任何人都可以帮助我。

1 个答案:

答案 0 :(得分:0)

当您将日期设置为日期格式时,MAX()将选择日期编号最高的日期,这不一定是最近的日期。例如,26-10-2016高于21-11-2017,因为26高于21。要按格式化日期订购,必须采用%Y-%m-%d格式。

当您选择格式化后的最长时间时,您将获得完全忽略日期的最长时间。

不是将MAX()应用于DATE_FORMAT的结果,而是获取最大值DateAndTime并根据需要格式化:

DATE_FORMAT(MAX(DateAndTime, '%d-%m=%Y')) AS Date,
DATE_FORMAT(MAX(DateAndTime, '%h:%i:%s')) AS Time

要按显示的日期和时间对结果进行排序,请使用:

ORDER BY STR_TO_DATE('%d-%m-%Y %h:%i:%s', CONCAT(Date, ' ', Time)) DESC

你不应该在DateAndTime中拥有GROUP BY,因为那时你每次都会得到一个单独的组。您需要将所有时间组合到一个组中,以便随后使用MAX(DateAndTime)获取最后一个值。