2016-10-12 5 views
1

meeting.idの個体ごとに2つの結果を返すにはどうすればよいですか?個体IDごとに2つの結果に制限

Row_Count()Rank()のようなものを試しましたが、構文エラーが発生するようです。

これは私がmeeting.idごとに2つの結果を表示するために適応する必要がある私のクエリです。

SELECT meeting_appointment.* FROM `meeting` 
    INNER JOIN meeting_appointment ON ( 
     meeting_appointment.meeting_id = meeting.id AND meeting_appointment.pupil_id = 0 AND meeting_appointment.guardian_id = 0 AND meeting_appointment.deleted = 0 
    ) 
    WHERE ( 
     meeting.grade_id = "-1" OR meeting.grade_id IN ('87') 
    ) 
    AND meeting.startTime < '2016-10-06 14:00:00' + INTERVAL 1 HOUR AND meeting.startTime > '2016-10-06 14:00:00' - INTERVAL 1 HOUR 

    GROUP by meeting_appointment.id 
    ORDER BY meeting_appointment.startTime ASC 
+0

これを行うには、「UNION」を使用する必要があります。 – CptMisery

+0

@CptMiseryなぜ 'UNION'ですか? –

答えて

1

あなたmeeting_appointment.idが連続している場合、これはmeeting.idにつき最初の2 meeting_appointment.idを表示する必要があります:あなたはそれが必要な場合がありますちょうどランダムまたはその後、非数値meeting_appointment.idある場合

SELECT meeting_appointment.* FROM `meeting` 
INNER JOIN meeting_appointment ON (meeting_appointment.meeting_id = meeting.id) 

WHERE (meeting.grade_id = "-1" OR meeting.grade_id IN ('87')) 
AND meeting.startTime < '2016-10-06 14:00:00' + INTERVAL 1 HOUR AND meeting.startTime > '2016-10-06 14:00:00' - INTERVAL 1 HOUR 
AND meeting_appointment.pupil_id = 0 
AND meeting_appointment.guardian_id = 0 
AND meeting_appointment.deleted = 0 
AND NOT EXISTS 
(SELECT 1 FROM meeting_appointment ma WHERE ma.id<meeting_appointment.id-1 
    AND ma.pupil_id = 0 
    AND ma.guardian_id = 0 
    AND ma.deleted = 0 
) 
GROUP by meeting_appointment.id 
ORDER BY meeting_appointment.startTime ASC 

いくつかの調整がありますが、それらのチークをコード化するためには、スキーマについてもう少し知る必要があります。

+0

私は「#1054 - Unknown column 'ma' in 'where clause」というエラーを受け取ります。 –

+0

ありがとうございました:) –

1

集計関数がないため、GROUP BYは冗長です。それを削除し、LIMIT句を追加し、あなたが行って良いことがあります:あなたはまた、datetime列にBETWEENを使用することができます

SELECT ma.* 
FROM meeting m 
INNER JOIN meeting_appointment ma ON ma.meeting_id = m.id 
WHERE m.grade_id IN ('-1','87') 
AND ma.pupil_id = 0 
AND ma.guardian_id = 0 
AND ma.deleted = 0 
AND m.startTime < '2016-10-06 14:00:00' + INTERVAL 1 HOUR 
AND m.startTime > '2016-10-06 14:00:00' - INTERVAL 1 HOUR 
ORDER BY ma.startTime ASC 
LIMIT 2; 

+1

上記のクエリは全体的な結果を2だけ制限します。OPが各meeting.idの結果を2で制限するかどうかは疑問です。 –

+0

今質問があります。私はこの問題がhttp://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sqlとhttp://と似ていると思うstackoverflow.com/questions/12113699/get-top-n-records-for-each-group-of-grouped-results ...だから今私は考えている、結果セットはどれくらい大きくなるだろうか?大きすぎない場合は、必要なIDを取得して何かを行うだけで、大きなスピードアップを得ることができます。これが実際にどのように使用されるのかを理解することは有益かもしれません。 – Eugene

+0

@ユージーン - あなたが私に必要な答えを私に提供したstackoverflowリンク。私は 'UNION_ALL'を使用するつもりです –

関連する問題