MySql - взять максимум из нескольких возможных значений соединения - PullRequest
0 голосов
/ 04 августа 2020

Извините, если то, что я пытаюсь спросить, сбивает с толку, я упрощаю очень сложный запрос до go до точки проблемы.

Допустим, у меня есть TableA со следующим столбцы: item_id; цена; date.

У меня также есть TableB с теми же тремя столбцами, и из обеих таблиц совпадают только идентификаторы.

Пример:

Table A:
+---------+-------+------------+
| item_id | price | date       |
+---------+-------+------------+
| 1       | 60    | 2020/08/04 |
+---------+-------+------------+
| 2       | 100   | 2020/07/23 |
+---------+-------+------------+

Table B:
+---------+-------+------------+
| item_id | price | date       |
+---------+-------+------------+
| 1       | 80    | 2020/08/05 |
+---------+-------+------------+
| 2       | 70    | 2020/07/24 |
+---------+-------+------------+
| 2       | 90    | 2020/07/20 |
+---------+-------+------------+
| 2       | 60    | 2020/06/20 |
+---------+-------+------------+

Я хочу присоединиться к этим 2 таблицы с использованием MySql, но с условием, что дата TableB должна быть ближе всего к дате TableA, но раньше.

Expected result:
+---------+---------+---------+
| item_id | price A | price B |
+---------+---------+---------+
| 1       | 60      | NULL    |  (As B date is superior to A)
+---------+---------+---------+
| 2       | 100     | 90      |  (I ignore the superior(s), and of the other 2 I take max date)
+---------+---------+---------+

Я попытался выполнить LEFT JOIN, но он добавляет несколько строк на выходе, и я не совсем уверен, как правильно написать условия. Я новичок в написании таких сложных запросов, единственное, что я знал, 2 дня go на самом деле были базовыми c, и поэтому, когда я попытался найти в Google способы сделать это, я только больше запутался. 1014 * Спасибо за внимание!

1 Ответ

0 голосов
/ 04 августа 2020

Я думаю, что самый простой подход - это коррелированный подзапрос, который восстанавливает строки из второй таблицы, которые соответствуют id и имеют более раннюю date, а затем возвращает цену "верхней" строки:

select
    a.item_id,
    a.price price_a
    (
        select b.price 
        from tableb b 
        where b.id = a.id and b.date < a.date 
        order by b.date desc 
        limit 1
    ) price_b
from tablea a

Для повышения производительности рассмотрите индекс на tableb(id, date, price).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...