如何获取由一列过滤的MySQL行

问题描述 投票:0回答:4

我有一个名为cabeceraticket的MySQL表。

它有字段:id,session,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的给定值来自变量,为简单起见,我在这里放置了特定的值。

mysql sql group-by greatest-n-per-group
4个回答
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
投票

尝试这样的事情:

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 )

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
)

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
© www.soinside.com 2019 - 2024. All rights reserved.