如何获得按一列过滤的MySQL行

时间:2019-04-11 13:36:07

标签: mysql sql group-by greatest-n-per-group

我有一个称为cabeceraticket的MySQL表。

它具有以下字段:id,sesion,nummesa,numplano,estado,sesion ...

id=44, nummesa= 21, numplano = 7, estado = 100
id=45, nummesa= 22, numplano = 7, estado = 100
id=46, nummesa= 24, numplano = 7, estado = 400
id=47, nummesa= 24, numplano = 7, estado = 100
id=48, nummesa= 7,  numplano = 7, estado = 100

我需要列出对字段nummesa进行过滤的所有行。对于相同的nummesa值,我只需要最后一行。

在这种情况下,查询结果应列出id = 44,45,47,48的行

不应列出ID = 46的行,对于nummesa,其值应与ID = 47的行相同,但其ID更大。

这是基本查询:

SELECT nummesa,numplano,estado,id 
FROM cabeceraticket  
WHERE sesion = 8 
AND numplano = 7 
GROUP BY nummesa

session和estado的给定值来自变量,为简单起见,我在此处输入了特定的值。

4 个答案:

答案 0 :(得分:3)

如果我正确理解了您的问题,则应该可以将表加入一个子查询,该子查询为每个id查找最新的nummesa值:

SELECT t1.id, t1.nummesa, t1.numplano, t1.estado
FROM cabeceraticket t1
INNER JOIN
(
    SELECT numessa, MAX(id) AS max_id
    FROM cabeceraticket
    GROUP BY numessa
) t2
    ON t1.numessa = t2.numessa AND t1.id = t2.max_id;

如果您使用的是MySQL 8+,则可以利用ROW_NUMBER来进行较为简单的查询:

SELECT id, nummesa, numplano, estado
FROM
(
    SELECT *, ROW_NUMBER() OVER (PARTITION BY numessa ORDER BY id DESC) rn
    FROM cabeceraticket
) t
WHERE rn = 1;

答案 1 :(得分:1)

尝试这样的事情:

SELECT nummesa, numplano, estado, id
FROM cabeceraticket
WHERE id IN ( SELECT MAX(id) AS id FROM cabeceraticket WHERE sesion = 8 AND numplano = 7
              GROUP BY nummesa )

答案 2 :(得分:0)

强制性NOT EXISTS解决方案:

SELECT *
FROM t
WHERE NOT EXISTS (
    -- select newer rows for outer row
    SELECT 1
    FROM t AS x
    WHERE x.nummesa = t.nummesa
    AND x.id > t.id
)

答案 3 :(得分:0)

您可以将表与其自身连接,然后仅选择最新行(这样就避免了子查询)

SELECT t1.* FROM cabeceraticket t1
LEFT JOIN cabeceraticket t2
ON t1.nummesa = t2.nummesa AND t1.id < t2.id
WHERE t2.id IS NULL