MySQL JOIN на основе самой высокой даты и неуникальных столбцов - PullRequest
1 голос
/ 09 июня 2011

Мне нужна помощь с запросом MySQL, над которым я работаю.У меня есть данные следующим образом.

Таблица 1

id   date1        text     number
---|------------|--------|-------
1  | 2012-12-12 | hi     | 399 
2  | 2011-11-11 | so     | 399
5  | 2010-10-10 | what   | 555
3  | 2009-09-09 | bye    | 300
4  | 2008-08-08 | you    | 300

Таблица 2

id   number   date2        ref
---|--------|------------|----
1  | 399    | 2012-06-06 | 40
2  | 399    | 2011-06-06 | 50
5  | 555    | 2011-03-03 | 60

Для каждой строки в Таблице 1 я хочу получить ноль или одно значение refиз таблицы 2. Должна быть строка в результате для каждой строки в таблице 1. Столбец чисел не уникален ни для одной из таблиц, поэтому объединение должно быть выполнено с использованием столбцов date1 и date2, где date2 - наибольшее значение длячисло без превышения даты1 для этого числа.

Желаемый результат из вышеприведенного примера будет таким:

 date1        text     number   ref
------------|--------|--------|-----
 2012-12-12 | hi     | 399    | 40
 2011-11-11 | so     | 399    | 50
 2010-10-10 | what   | 555    | null
 2009-09-09 | bye    | 300    | null
 2008-08-08 | you    | 300    | null

Вы можете видеть в первой строке результата, было выбрано значение 40потому что в таблице 2 запись с ref = 40 имела дату2, которая была меньше даты1, и самую высокую дату, которая соответствовала этому условию.Во второй строке результата было выбрано значение ref 50, поскольку в таблице 2 запись с ref = 50 имела дату2, которая была меньше даты1, и самую высокую дату, которая соответствовала этому условию.Остальные результаты имеют нулевые ссылки, потому что date1 всегда меньше или соответствующее число не существует в таблице 2.

Я дошел до определенного момента, но застрял.На данный момент у меня есть следующий запрос:

SELECT date1, text, number, ref
FROM table1
LEFT JOIN (
    SELECT * 
    FROM (
        SELECT * 
        FROM table2
        WHERE date2 <= '2012-12-12'
        ORDER BY date2 DESC
    ) tmp 
    GROUP BY msisdn
) tmp ON table1.number = table2.number;

Проблема в том, что жестко закодированная дата не подходит, она должна основываться на date1, но я не могу использовать date1, потому что она ввнешний запрос.Есть ли способ, которым я могу сделать эту работу?

Ответы [ 2 ]

1 голос
/ 09 июня 2011

Я только что попробовал похожий пример с разными таблицами и смог получить то, что вы хотели. Ниже приведен аналогичный запрос, модифицированный в соответствии с вашими потребностями. Вы можете изменить < на <=, если это то, что вы ищете.

SELECT a.date1, a.text, b.ref
FROM table1 a LEFT JOIN table2 b ON 
                        ( a.number = b.number
                          AND  a.date1 > b.date2 
                          AND b.date2 = ( SELECT MAX(x.date2) 
                                          FROM table2 x 
                                          WHERE x.number = b.number 
                                             AND x.date2 < a.date1)
                        )
0 голосов
/ 09 июня 2011

Не проверено:

SELECT t1.date1, 
       t1.text,
       t1.number,
       (SELECT a.ref
          FROM TABLE_2 a
          JOIN (SELECT t.number,
                       MAX(t.date2) AS max_date
                  FROM TABLE_2 t
                 WHERE t.number = t1.number
                   AND t.date2 <= t1.date1
              GROUP BY t.number) b ON b.number = a.number
                                  AND b.max_date = a.date2)
  FROM TABLE_1 t1

Проблема заключается в использовании t1 в производной таблице подвыбора ...

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