LEFT JOIN на максимальной стоимости
Предположим, что у меня есть следующие две таблицы:
STUDENT
studentid lastname firstname
1 Smith John
2 Drew Nancy
STUDENT_STORY
studentid dateline storyid status
1 1328313600 10 2
1 1328313601 9 1
2 1328313602 14 2
2 1328313603 12 1
Теперь мне нужен SQL-запрос, который будет выбирать каждого ученика вместе с последней историей для этого студента в таблице рассказов ученика.
Я пытаюсь это сделать:
SELECT s.*, ss.*
FROM student AS s
LEFT JOIN (
SELECT *
FROM student_story
WHERE student_story.studentid = s.studentid
ORDER BY dateline DESC LIMIT 1
) AS ss ON (ss.studentid = s.studentid)
Однако этот запрос не работает. Он жалуется, что s.studentid является неизвестным полем в предложении where запроса sub.
Прошу предложить, как я могу добиться того, что я пытаюсь сделать.
Спасибо.
Ответы
Ответ 1
Попробуйте что-то вроде этого:
SELECT
s.*,
ss.*
FROM
student AS s
LEFT JOIN
student_story AS ss
ON (ss.studentid = s.studentid)
WHERE ss.dateline = (
SELECT
MAX(dateline)
FROM
student_story AS ss2
WHERE
ss2.studentid = s.studentid
)
Ответ 2
SELECT s.*, ss.*
FROM student AS s
LEFT JOIN (
SELECT * FROM student_story
ORDER BY dateline DESC LIMIT 1
)
AS ss ON (ss.studentid = s.studentid)
Ответ 3
Это соединение должно сделать это:
SELECT s.*, ss.*
FROM student_story AS ss
LEFT JOIN student AS s
ON student_story.studentid = s.userid
GROUP BY ss.studentid
GROUP BY
должен взять последнюю строку, поэтому последняя история = последняя строка, если она не будет работать, попробуйте:
GROUP BY ss.studentid, ss.dateline DESC
Я не уверен в этом, прокомментируйте результат
Ответ 4
SELECT
s.sale_id,
s.created_at,
p.created_at,
DATEDIFF(p.created_at, s.created_at) AS days
FROM
pos_sales s
LEFT JOIN
pos_payments p ON p.sale_id = s.sale_id
AND
p.created_at = (SELECT
MAX(p2.created_at)
FROM
pos_payments p2
WHERE
p2.sale_id = p.sale_id)
Ответ 5
Вам нужно добавить автоматический и уникальный идентификатор в каждой строке таблицы student_story.
тогда вы будете различать их. (предположим studentstory.new_id)
select s.*, ss.*
from student s
left join student_story ss on ss.studentid = s.userid
where ss.new_id = ( select ss.new_id from student s
group by dateline
order by dateline desc
limit 1
)
Ответ 6
Другой подход заключается в создании LEFT JOIN
с условием NOT EXISTS()
. В зависимости от сценария это может дать немного большую гибкость; однако он также будет показывать повторяющиеся результаты, если есть две записи с тем же dateline
для каждого учащегося:
SELECT s.*, ss.*
FROM student AS s
LEFT JOIN student_story AS ss ON ss.studentid = s.studentid AND NOT EXISTS
(SELECT * FROM student_story AS ss2
WHERE ss2.studentid = ss.studentid AND ss2.dateline > ss.dateline)