web-dev-qa-db-ja.com

最大値の左結合

次の2つのテーブルがあるとします。

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句の不明なフィールドであることを訴えます。

私がやろうとしていることをどのように達成できるかを提案してください。

ありがとう。

17
akanevsky

次のようなものを試してください:

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
)
28
Detheroc
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)
2
Yahoo - Jungly

この結合はそれを行うべきです:

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

よくわかりません。結果をコメントしてください

1
Vyktor
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)
1
Namal

Student_storyテーブルの各行に自動および一意のIDを追加する必要があります。

次に、それらを区別します。 (studenttory.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
)
0
daffy

別のアプローチは、NOT EXISTS()条件でLEFT JOINを作成することです。シナリオによっては、これによりもう少し柔軟性が得られます。ただし、学生ごとに同じdatelineのエントリが2つある場合は、重複した結果も表示されます。

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)
0
E. Villiger