Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于获取类的顶级实例的Mysql查询_Mysql_Sql - Fatal编程技术网

用于获取类的顶级实例的Mysql查询

用于获取类的顶级实例的Mysql查询,mysql,sql,Mysql,Sql,我有一张如下表: COL1 | COL2 | COL3 ______________________ ITEM1 | CLASS1 | DATE1 ITEM2 | CLASS3 | DATE2 ITEM3 | CLASS1 | DATE3 ITEM4 | CLASS2 | DATE4 ITEM5 | CLASS1 | DATE2 ITEM6 | CLASS3 | DATE6 ITEM7 | CLASS2 | DATE3 . . 我想按降序日期排列数据,然后得到每个类的前2个条目。我不知道

我有一张如下表:

COL1  | COL2   | COL3
______________________
ITEM1 | CLASS1 | DATE1
ITEM2 | CLASS3 | DATE2
ITEM3 | CLASS1 | DATE3
ITEM4 | CLASS2 | DATE4
ITEM5 | CLASS1 | DATE2
ITEM6 | CLASS3 | DATE6
ITEM7 | CLASS2 | DATE3
.
.

我想按降序日期排列数据,然后得到每个类的前2个条目。我不知道该怎么做。请帮助。

没有尝试,请尝试一下:

SELECT t.*, max(col3) as `date`  /* Most recent date */
  FROM table t
  GROUP BY col2 

UNION 

SELECT t2.*, max(col3) as `date` /* second recent date */
  FROM table t2
  WHERE col3 NOT IN 
     (SELECT max(col3) WHERE col2 = t2.col2 GROUP BY col2) 
  GROUP BY col2 

未尝试,请尝试:

SELECT t.*, max(col3) as `date`  /* Most recent date */
  FROM table t
  GROUP BY col2 

UNION 

SELECT t2.*, max(col3) as `date` /* second recent date */
  FROM table t2
  WHERE col3 NOT IN 
     (SELECT max(col3) WHERE col2 = t2.col2 GROUP BY col2) 
  GROUP BY col2 
试试这个

(
SELECT t1.* FROM the_table t1
   LEFT JOIN the_table t2 ON t2.col2=t1.col2 AND t2.col3<t1.col3
   LEFT JOIN the_Table t3 ON t3.col2=t2.col2 AND t3.col3<t2.col3
WHERE t3.col2 IS NULL AND t2.col2 IS NOT NULL
ORDER BY t1.col2,t1.col3 DESC
)
UNION
(
SELECT t4.* FROM the_table t4
   LEFT JOIN the_table t5 ON t4.col2=t5.col2 AND t4.col1!=t5.col1
   LEFT JOIN the_Table t6 ON t5.col2=t6.col2 AND t5.col1!=t6.col1
WHERE t6.col1 IS NULL
ORDER BY t4.col3 DESC
)
注意:union中的第二部分用于获取每个类少于3条记录的行

(
SELECT t1.* FROM the_table t1
   LEFT JOIN the_table t2 ON t2.col2=t1.col2 AND t2.col3<t1.col3
   LEFT JOIN the_Table t3 ON t3.col2=t2.col2 AND t3.col3<t2.col3
WHERE t3.col2 IS NULL AND t2.col2 IS NOT NULL
ORDER BY t1.col2,t1.col3 DESC
)
UNION
(
SELECT t4.* FROM the_table t4
   LEFT JOIN the_table t5 ON t4.col2=t5.col2 AND t4.col1!=t5.col1
   LEFT JOIN the_Table t6 ON t5.col2=t6.col2 AND t5.col1!=t6.col1
WHERE t6.col1 IS NULL
ORDER BY t4.col3 DESC
)

注意:union中的第二部分用于获取每个类少于3条记录的行

尝试此查询,它将记录排列在一个组中,然后使用rank筛选结果-

SELECT col1, col2, col3 FROM (
  SELECT e1.*, COUNT(*) p FROM entries e1
    LEFT JOIN entries e2
      ON e1.col2 = e2.col2 AND e1.col3 <= e2.col3
    GROUP BY e1.col2, e1.col3
  ) t
WHERE p < 3

+-------+--------+-------+
| col1  | col2   | col3  |
+-------+--------+-------+
| ITEM5 | CLASS1 | DATE2 |
| ITEM3 | CLASS1 | DATE3 |
| ITEM7 | CLASS2 | DATE3 |
| ITEM4 | CLASS2 | DATE4 |
| ITEM2 | CLASS3 | DATE2 |
| ITEM6 | CLASS3 | DATE6 |
+-------+--------+-------+

尝试此查询,它对组中的记录进行排名,然后使用排名筛选结果-

SELECT col1, col2, col3 FROM (
  SELECT e1.*, COUNT(*) p FROM entries e1
    LEFT JOIN entries e2
      ON e1.col2 = e2.col2 AND e1.col3 <= e2.col3
    GROUP BY e1.col2, e1.col3
  ) t
WHERE p < 3

+-------+--------+-------+
| col1  | col2   | col3  |
+-------+--------+-------+
| ITEM5 | CLASS1 | DATE2 |
| ITEM3 | CLASS1 | DATE3 |
| ITEM7 | CLASS2 | DATE3 |
| ITEM4 | CLASS2 | DATE4 |
| ITEM2 | CLASS3 | DATE2 |
| ITEM6 | CLASS3 | DATE6 |
+-------+--------+-------+

第二个查询不应该有分组依据?不仅子查询,而且查询本身。联合后的查询应该是分组依据查询。实际上,将返回单个值。您错过了SELECT子句中该列的其余部分。无论如何,修复了这个问题,有一个更好的解决方案,但它是有效的,并且不是很难看+第二个查询不应具有分组依据?不仅子查询,而且查询本身联合后的查询应为分组依据查询。实际上,将返回单个值。您错过了SELECT子句中该列的其余部分。无论如何,修复了这个问题,有一个更好的解决方案,但它是有效的,并且不是很难看+一个来自我,另外一个来自我;用这个比我建议的怪物更好@德瓦特,太棒了,非常感谢你。我显示的结果是两个表的联接。但我会解决的。再次感谢我+1;用这个比我建议的怪物更好@德瓦特,太棒了,非常感谢你。我显示的结果是两个表的联接。但我会解决的。再次感谢您最好使用@Devart的建议。最好使用@Devart的建议。