我有一个名为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的给定值来自变量,为简单起见,我在这里放置了特定的值。
如果我正确理解你的问题,你应该能够将你的表加入一个子查询,该子查询找到每个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;
尝试这样的事情:
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 )
强制性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
)
您可以将表连接到自身并仅选择最新的行(并且您正在避免使用子查询)
SELECT t1.* FROM cabeceraticket t1
LEFT JOIN cabeceraticket t2
ON t1.nummesa = t2.nummesa AND t1.id < t2.id
WHERE t2.id IS NULL