我有一个称为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的给定值来自变量,为简单起见,我在此处输入了特定的值。
答案 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