2016-02-23 3 views
0

Учитывая две таблицы A и B, мне нужны все записи из A, где A.Param = "X". Я также хочу ЛЕВАЯ ВСТУПЛЕНИЕ на B, где B содержит записи испытаний различными A.Ids для различных экспериментов m, n, o ...MySQL Left Присоединиться к последней записи

В записях B есть отметка времени в виде B.TrialTime (DateTime). По мере того, как проект идет, может быть несколько испытаний для одного и того же эксперимента с тем же A.Id в B и для целей LEFT JOIN Мне нужно только последнее испытание. Это то, что я придумал:

SELECT A.*, B.Experiment, B.Response, B.Evaluation, MAX(B.TrialTime) FROM A 
LEFT JOIN B ON B.UserID = A.ID 
WHERE A.Param = "X" GROUP BY concat(B.UserID, B.Experiment) 

Проблема не в том, что больше не действует как LEFT JOIN, то есть я не получаю всех пользователей от А, даже если у них нет ни одной записи в B , и это то, что мне нужно. Любая помощь?

+0

Пожалуйста, разместите свой код связанных структур таблиц ('create table code') – 1000111

ответ

0

Без доступа к специфике таблиц, проблема вы сталкиваетесь зная, «самый последний» суд (в таблице B)

Во многих СУБД можно использовать ROW_NUMBER(), чтобы решить эту проблему, но, как но MySQL не предоставляет эту полезную функцию. Так что вам нужно сделать что-то вроде этого:

SELECT 
     a.* 
     , b.* 
FROM A 
     LEFT JOIN 
     (
       SELECT 
         bb.* 
       FROM B bb 
         INNER JOIN 
         (
           SELECT 
             UserID 
             , MAX(TrialTime) MostRecent 
           FROM B 
           GROUP BY B.UserID 
         ) bmax ON bb.UserID = bmax.UserID 
           AND bb.TrialTime = bmax.MostRecent 
     ) b ON B.UserID = A.ID 

В основном это не возможно, чтобы получить MAX() некоторых столбцов, и все другие значения столбцов «из этой строки», в то же время. Вы должны получить MAX (TrialTime), а затем присоединиться к той же таблице, чтобы получить соответствующие строки.

Для сравнения, если row_number() был доступен, это то, как это может быть сделано:

SELECT 
     a.* 
     , b.* 
FROM A 
     LEFT JOIN 
     (
       SELECT 
         bb.* 
         , ROW_NUMBER() OVER (PARTITION BY bb.userid 
              ORDER BY bb.TrialTime DESC) AS rn 
       FROM B bb 
     ) b ON B.UserID = A.ID 
       AND b.rn = 1 

Кстати, не существует какая-либо конкретная причина, для использования ЛЕВОГО [OUTER ] ПРИСОЕДИНИТЬСЯ. Если вам нужны строки из A, которые не подключены к данным в B, вам потребуется внешнее соединение, иначе вы должны использовать INNER JOIN для повышения эффективности.

+0

Спасибо за ответ, я не понял, что другие значения столбцов не соответствуют записи Max (TrialTime). Решение Inner Join работало для меня. –

Смежные вопросы