МАКСИМАЛЬНОЕ условие для левого внешнего соединения

#mysql

#mysql

Вопрос:

 ----------
samples
----------
SamplesID
stylenumber
stylename
status

-----------
samples_details
-----------
Samples_Details_ID
SamplesID
CustomerName
date_out
date_returned
updated (timestamp)
status

------------
samples_pictures
------------
SamplesPicID
SamplesID
  

Пытаюсь написать запрос, который выдает мне все строки из samples, все совпадения (если таковые имеются) из samples_pictures и самую последнюю запись (если таковая имеется) из samples_details. Итак, два левых внешних соединения, но одно извлекает только самую последнюю запись.

Что не работает:

 SELECT samples.*
     , samples_pictures.SamplesPicID
     , CustomerName
     , date_out
     , date_returned
     , updated
     , samples_details.status as txn_status 
FROM samples 
    LEFT OUTER JOIN
      ( SELECT Samples_Details_ID
             , samples_details.status as txn_status
             , MAX(updated) as MaxUpdated
        FROM samples_details
        GROUP BY Samples_Details_ID
      ) AS MaxTable
      ON MaxTable.SamplesID = samples.SamplesID 
    LEFT OUTER JOIN samples_pictures
      ON samples.SamplesID = samples_pictures.SamplesID
  

Любая помощь была бы высоко оценена!

Комментарии:

1. обратная таблица MAX. SamplesID и samples.samplesId?

Ответ №1:

Ваш исходный запрос по-прежнему выбирает каждую запись из samples_details.

Вам нужно будет создать подвыборку, чтобы отфильтровать только те записи с максимальной временной меткой, и объединить это обратно с вашей таблицей samples_details, чтобы получить дополнительные столбцы.

 SELECT   *
FROM     samples s
         LEFT OUTER JOIN sample_details sd ON sd.SamplesID = s.SamplesID
         INNER JOIN (
           SELECT   SamplesID
                    , MAX(update) AS Update
           FROM     samples_details
           GROUP BY
                    SamplesID
         ) sdm ON sdm.SamplesID = sd.SamplesID
         LEFT OUTER JOIN samples_pictures sp ON sp.SamplesID = s.SamplesID
  

Комментарии:

1. @TjJunior, если ответ правильный, вы можете отметить его как таковой и наградить волонтера, который помог вам, небольшим знаком признательности. Если оба наших ответа верны (как вы говорите), dgilland ответьте первым. Принятый ответ должен перейти к нему.

Ответ №2:

В вашем операторе select нет SamplesID для MaxTable . Должно быть:

 SELECT samples.*, samples_pictures.SamplesPicID, CustomerName, date_out, 
date_returned, updated, samples_details.status as txn_status 
FROM samples 
    LEFT OUTER JOIN (SELECT SamplesID, Samples_Details_ID, samples_details.status as txn_status, 
    MAX(updated) as MaxUpdated FROM samples_details GROUP BY Samples_Details_ID) 
    AS MaxTable ON MaxTable.SamplesID = samples.SamplesID 
LEFT OUTER JOIN samples_pictures ON samples.SamplesID = samples_pictures.SamplesID
  

Ответ №3:

 SELECT samples.*
     , samples_pictures.SamplesPicID
     , CustomerName
     , date_out
     , date_returned
     , updated
     , samples_details.status as txn_status
FROM samples 
    LEFT OUTER JOIN samples_details
      ON samples.SamplesID = samples_details.SamplesID
      AND samples_details.updated =
      ( SELECT MAX(updated)
        FROM samples_details
            WHERE SamplesID = samples.SamplesID)
      )
    LEFT OUTER JOIN samples_pictures
      ON samples.SamplesID = samples_pictures.SamplesID
  

Комментарии:

1. сэкономило мне много часов 🙂 хорошо, может быть, всего десять минут… но это намного умнее по сравнению с тем, что я намеревался сделать! Спасибо

Ответ №4:

 SELECT samples.*
     , samples_pictures.SamplesPicID
     , CustomerName
     , date_out
     , date_returned
     , updated
     , txn_status 
FROM samples 
    LEFT OUTER JOIN
      ( SELECT Samples_ID
             , status as txn_status
        FROM samples_details
            INNER JOIN
              ( SELECT Samples_ID,
                       Samples_Details_ID
                     , MAX(updated) as MaxUpdated
                FROM samples_details
                GROUP BY Samples_ID, Samples_Details_ID
              ) AS MaxTable
              ON MaxTable.Samples_ID = samples.SamplesID
              AND MaxTable.Samples_Details_ID = samples.Samples_Details_ID
      ) AS MaxJoin
    LEFT OUTER JOIN samples_pictures
      ON samples.SamplesID = samples_pictures.SamplesID