Мне нужна помощь с запросом SQL в PHP (WordPress). У меня есть эти данные:
| id | kw_id | date | position
| 1 | 1 | 2020.08.23 | 16 |
| 2 | 1 | 2020.10.02 | 17 |
| 3 | 2 | 2020.10.08 | 5 |
| 4 | 2 | 2020.10.08 | 6 |
и мне нужно получить две строки (id=2, id=3). Критериев запроса два:
когда у даты есть дубликаты ( id=3 и id=4 ), тогда получите строку с минимальной позицией.
id | kw_id | date | position
2 | 1 | 2020.10.02 | 17
3 | 2 | 2020.10.08 | 5
Заранее спасибо.
Если вы используете MySQL 8+, то ROW_NUMBER
предоставляет один вариант:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY id ORDER BY date DESC, position) rn
FROM yourTable
)
SELECT id, kw_id, date, position
FROM cte
WHERE rn = 1;
Приведенный выше вызов ROW_NUMBER
помещает самую позднюю дату на первое место для каждого id
, а в случае ничьей по дате на первое место ставит наименьшую позицию.
Для устаревшей версии MySQL 5.* это может быть немного сложно. Ниже запрос, который возвращает идентификатор иглы:
select min(id) as min_id
from tbl
join (
select kw_id, max(date) max_date
from tbl
group by kw_id
) tbl1 on tbl1.max_date = tbl.date and tbl1.kw_id = tbl.kw_id
group by tbl.kw_id;
результат:
+========+
| min_id |
+========+
| 2 |
+--------+
| 3 |
+--------+
и теперь окончательный запрос:
select * from tbl where id in (
select min(id) as min_id
from tbl
join (
select kw_id, max(date) max_date
from tbl
group by kw_id
) tbl1 on tbl1.max_date = tbl.date and tbl1.kw_id = tbl.kw_id
group by tbl.kw_id
);
и окончательный результат:
+====+=======+============+==========+
| id | kw_id | date | position |
+====+=======+============+==========+
| 2 | 1 | 2020-10-02 | 17 |
+----+-------+------------+----------+
| 3 | 2 | 2020-10-08 | 5 |
+----+-------+------------+----------+
а здесь живая скрипта SQL