#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