Как получить строки MySQL, отфильтрованные по одному столбцу - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть таблица MySQL с именем cabeceraticket.

В ней есть поля: 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

Указанные значения для сессий и estado получены из переменных, я привел здесь конкретные значения для простоты.

Ответы [ 4 ]

3 голосов
/ 11 апреля 2019

Если я правильно понимаю ваш вопрос, вы сможете просто присоединить свою таблицу к подзапросу, который находит самое последнее значение 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;

Если вы используете MySQL8+, тогда вы можете воспользоваться 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 голос
/ 11 апреля 2019

Попробуйте что-то вроде этого:

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 голосов
/ 11 апреля 2019

Вы можете присоединить таблицу к себе и выбрать только последнюю строку (и вы избегаете подзапроса)

SELECT t1.* FROM cabeceraticket t1
LEFT JOIN cabeceraticket t2
ON t1.nummesa = t2.nummesa AND t1.id < t2.id
WHERE t2.id IS NULL
0 голосов
/ 11 апреля 2019

Обязательно 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
)
...