SQL-запрос в PHP (WordPress)

Мне нужна помощь с запросом 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). Критериев запроса два:

  1. получить строку с максимальной датой
  2. группа по kw_id

когда у даты есть дубликаты ( id=3 и id=4 ), тогда получите строку с минимальной позицией.

Результат должен быть следующим:

id | kw_id | date         | position
2  | 1     | 2020.10.02   | 17
3  | 2     | 2020.10.08   | 5

Заранее спасибо.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
0
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы используете 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

Другие вопросы по теме