0

私はこのクエリを持っています:

SELECT 
    e.*, u.name AS event_creator_name 
FROM `edu_events` e 
    LEFT JOIN `edu_users` u 
        ON u.user_id = e.event_creator 
    INNER JOIN `edu_event_participants` 
        ON participant_event = e.event_id && participant_user = 1 
WHERE 
    MONTH(e.event_date_start) = 6 
    AND YEAR(e.event_date_start) = 2013

それは完全に機能しますが、値が e.event_type が 1 の場合にのみ INNER JOIN を実行したいのです。そうでない場合は、INNER JOIN を無視する必要があります。

私はしばらくの間それを理解しようとしましたが、解決策は私の提案のために実装するのが難しいようです(それは選択/特定の値のためだけです)。

私は次のようなことを考えています:

SELECT 
    e.*, u.name AS event_creator_name 
FROM `edu_events` e 
    LEFT JOIN `edu_users` u ON u.user_id = e.event_creator

if(e.event_type == 1) {
    INNER JOIN `edu_event_participants` ON participant_event = e.event_id && participant_user = 1 
}

WHERE MONTH(e.event_date_start) = 6 
AND YEAR(e.event_date_start) = 2013
4

3 に答える 3

0

私の理解が正しければ、edu_event_participants に同じ event_id とparticipant_user = 1 のエントリがある場合にのみ、event_type = 1 の場合にのみ結果が必要ですが、edu_event_participants テーブルから情報を取得する必要はありません。その場合:

SELECT 
    e.*, u.name AS event_creator_name 
FROM `edu_events` e 
    LEFT JOIN `edu_users` u 
        ON u.user_id = e.event_creator 
WHERE 
    -- as Simon at mso.net suggested
    WHERE e.event_date_start BETWEEN DATE('2013-06-01') AND DATE('2013-07-01')
    -- MONTH(e.event_date_start) = 6 
    -- AND YEAR(e.event_date_start) = 2013
    AND (
        -- either event is public
        e.event_type = 1 or
        -- or the user is in the participants table
        exists
            (select 1 from `edu_event_participants` 
            where participant_event = e.event_id
            AND participant_user = 1)
    )
于 2013-06-10T23:20:38.127 に答える
0

右のテーブルに一致するデータがない場合でも、左のテーブルの値を表示したいのではないでしょうか? その場合、次のように外部結合を使用できます。

LEFT OUTER JOIN `edu_event_participants` ON participant_event = e.event_id && participant_user = 1 AND e.event_type = 1
于 2013-06-10T22:59:06.460 に答える