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)