用于获取类的顶级实例的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的建议。