Php 由于GROUPBY语句,mysql查询中出现了一些奇怪的情况
我有一个表格,记录用户的考试结果:Php 由于GROUPBY语句,mysql查询中出现了一些奇怪的情况,php,mysql,sql,Php,Mysql,Sql,我有一个表格,记录用户的考试结果: CREATE TABLE IF NOT EXISTS `ts` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NULL, `xid` int(11) NOT NULL, `lid` int(11) NOT NULL, `grade` double NOT NULL, `duration` varchar(10) COLLATE utf8_turkish_ci NOT
CREATE TABLE IF NOT EXISTS `ts` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` int(11) NOT NULL,
`xid` int(11) NOT NULL,
`lid` int(11) NOT NULL,
`grade` double NOT NULL,
`duration` varchar(10) COLLATE utf8_turkish_ci NOT NULL,
`trues` int(11) NOT NULL DEFAULT '0',
`falses` int(11) NOT NULL DEFAULT '0',
`empties` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `uid` (`uid`),
KEY `xid` (`xid`),
KEY `lid` (`lid`),
) ENGINE=InnoDB;
我在表格中有这些记录:
|id|uid|xid|lid|grade|duration|trues|falses|empties|
+--+---+---+---+-----+--------+-----+------+-------+
|45| 20| 1| 1| 80|00:01:12| 8| 2| 0|
|46| 20| 1| 2| 40|00:02:31| 4| 6| 0|
|47| 20| 3| 1| 100|00:01:10| 1| 0| 0|
|48| 20| 4| 1| 83|00:00:51| 5| 1| 0|
|49| 20| 2| 1| 0|00:00:02| 0| 1| 0|
|53| 20| 4| 2| 50|00:00:04| 1| 1| 0|
|54| 20| 1| 2| 50|00:00:41| 5| 5| 0|
lid表示考试的难度等级,用xid表示。我想为每一个独特的考试展示最高的分数和独特的水平。例如,有7行。id[46]和id[54]用于相同的考试和级别。所以我必须列出这两行中较高的等级值
我提出了一个问题:
SELECT
failed.fgrade,
succeeded.sgrade,
ts.xid,
ts.lid,
ts.trues,
ts.falses,
ts.empties,
MAX(`grade`) AS grade,
ts.duration,
x.exam
FROM
ts
JOIN
x ON ts.xid = x.id
JOIN
(SELECT
COUNT(DISTINCT(xid)) AS sgrade
FROM ts
WHERE uid = 20 AND grade >= 70) AS succeeded
JOIN
(SELECT
COUNT(DISTINCT(xid)) AS fgrade
FROM ts
WHERE uid = 20 AND grade < 70 ) AS failed
WHERE
ts.uid = 20
GROUP BY
xid,
lid
ORDER BY
ts.id
如果你看这个!结果表中的行有一些奇怪的东西。4个正确答案和6个错误答案得40分。但它显示另一行的分数值,同时显示自己的正确答案计数和错误答案计数
我基本上希望为给定用户ID显示每个难度级别的所有不同考试。现在,当我写这个问题时,我开始认为这可能是由于小组发言。但是写这个问题花了一段时间。我无法删除此项。请考虑以下两行:
按xid分组时,第一行仅选择一行
|46| 20| 1| 2| 40|00:02:31| 4| 6| 0|
但对于maxgrade,它是一个聚合函数,这意味着它将查找所有结果行的get max value->maxgrade return 50。
->如果您将grade和maxgrade放在select中,您将同时收到40和50。
在您的情况下,我认为您应该加入两个ts表,以获得更高的分数值,如下所示:
select ts1.* from ts ts1 left join ts laster on ts1.xid = laster.xid and ts1.lid = laster.lid
and ts1.uid = laster.uid and ts1.grade < laster.grade where isnull(laster.grade)
你最后两次参加的比赛在哪里?真的吗,为什么连这些连接都在那里?对不起,输入错误,ts2是最后一个。
|46| 20| 1| 2| 40|00:02:31| 4| 6| 0|
select ts1.* from ts ts1 left join ts laster on ts1.xid = laster.xid and ts1.lid = laster.lid
and ts1.uid = laster.uid and ts1.grade < laster.grade where isnull(laster.grade)