0

我有一个正在我的数据库上测试的查询,但由于某种奇怪的原因,它随机返回一组不同的结果。有趣的是,它只返回两个不同的结果集,来自数千行,并且查询将随机返回一个或另一个,但没有别的。

查询仅返回两个数据集之一是否有原因?下面的查询和架构。

我的目标是在给定的时间段内为给定的赛道选择最快的圈速,但只为每个用户选择最快的圈速(因此前 10 名中总是有 10 个不同的用户)。

大多数情况下会返回正确的结果,但随机返回的是完全不同的结果集。

SELECT `lap`.`ID`, `lap`.`qualificationTime`, `lap`.`userId` 
FROM `lap` 
WHERE (lap.trackID =4)
AND (lap.raceDateTime >=  "2013-07-25 10:00:00")
AND (lap.raceDateTime <  "2013-08-04 23:59:59")
AND (isTestLap =0)
GROUP BY  `userId` 
ORDER BY  `qualificationTime` ASC 
LIMIT 10

架构:

CREATE TABLE IF NOT EXISTS `lap` (
    `ID` int(11) NOT NULL AUTO_INCREMENT,
    `userId` int(11) DEFAULT NULL,
    `trackId` int(11) DEFAULT NULL,
    `raceDateTime` datetime NOT NULL,
    `qualificationTime` decimal(7,4) DEFAULT '0.0000',
    `isTestLap` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`ID`)

(数据库创建脚本修剪不需要的列)

4

5 回答 5

1

您正在选择和lap.ID,但您不是他们。您只能选择分组依据的字段,或者在其他字段(、、等)上聚合函数。否则,结果是不确定的。lap.qualificationTimelap.userIdGROUPing BYMINMAXAVG

于 2013-07-26T10:15:56.327 回答
1

您正在使用 MySQL 的一个(错误)功能,称为隐藏列。正如其他人指出的那样,您可以在select语句中放置不在group by. 但是,返回的值是任意的,甚至不能保证每次运行都相同。

解决方案是找到每个用户的最长资格时间。然后将这些信息加入回来以获取其他字段。这是一种方法:

select l.*
from (SELECT userId, min(qualificationtime) as minqf
      FROM lap
      WHERE (lap.trackID =4)
      AND (lap.raceDateTime >=  "2013-07-25 10:00:00")
      AND (lap.raceDateTime <  "2013-08-04 23:59:59")
      AND (isTestLap =0)
      GROUP BY  `userId` 
     ) lu join
     lap l
     on lu.minqf = l.qualificationtime
ORDER BY  l.`qualificationTime` ASC 
LIMIT 10
于 2013-07-26T10:32:25.417 回答
0

我会检查这样的事情:

   SELECT  `l1`.`qualificationTime`, `l1`.`userId`,
          (SELECT l2.ID FROM `lap` AS l2 WHERE l2.`userId` = l1.userId AND 
          l2.qualificationTime = min(l1.`qualificationTime`))
   FROM `lap` AS `l1`
   WHERE (l1.trackID =4)
          AND (l1.raceDateTime >=  "2013-07-25 10:00:00")
          AND (l1.raceDateTime <  "2013-08-04 23:59:59")
          AND (isTestLap =0)
   GROUP BY  `userId`
   ORDER BY  `qualificationTime` ASC
   LIMIT 10
于 2013-07-26T10:28:18.010 回答
0

我认为您的意思是有时值lap. ID, lap. qualificationTime是不同的。这对 mysql 来说是正确的行为。因为您分组userId并且您不知道将返回其他字段的哪些值。Mysql 可以根据读取的第一个值或最后一行选择不同的值。

于 2013-07-26T10:17:26.297 回答
0

它可能是您在十进制实体上的 ORDER BY,以及数据库如何存储它然后检索它。

于 2013-07-26T10:19:38.203 回答