0

以前の投稿を確認しましたが、まだ問題を解決しているものはありません。

3 つのテーブルへの MYSQL クエリ (Users、Match、Interview)

指定されたマッチのユーザー名とインタビュー番号 (インタビュー番号がある場合) を返したい。

しかし、結果をインタビューしたユーザーだけに限定したくありません。JOIN を試しましたが、3 つのテーブルに対しては機能しません。

これが私がこれまでにPHPで持っていたものです:

$query = "SELECT CONCAT(u.first_name,' ',u.last_name,'----',COALESCE(i.v_code,'')) as name, u.id as id
FROM #__users as u

 JOIN #__bl_match as m ON ( (u.team_id = m.team1_id) OR 
     (u.team_id = m.team2_id) OR 
     (u.team_id = m.team3_id AND m.team3_id != 0) OR 
     (u.team_id = m.team4_id AND m.team4_id != 0) OR 
     (u.team_id = m.team5_id AND m.team5_id != 0) OR 
     (u.team_id = m.team6_id AND m.team6_id != 0) OR
     (u.team_id = m.team7_id AND m.team7_id != 0) OR
     (u.team_id = m.team8_id AND m.team8_id != 0) OR 
     (u.team_id = m.team9_id AND m.team9_id != 0) OR
     (u.team_id = m.team10_id AND m.team10_id != 0)) 
   AND m.id = ".$t_id."AND m.id != 0 

JOIN #__bl_interview as i ON i.u_id = u.id";

        $db->setQuery($query);
    $parti12 = $db->loadObjectList();
4

1 に答える 1

0

インタビューなしのユーザーが必要な場合は、インタビュー テーブルに LEFT JOIN を使用する必要がありますが、これは、そのユーザーのインタビュー番号が NULL になることを意味します。

SELECT リスト内のユーザー名と数字を連結しているため、インタビューがない場合、ユーザーの名前は NULL として返されます (文字列を NULL 値と連結するため、または他のほとんどの操作を実行するため)。 NULL 値の場合 - NULL の結果が生成されます)。

i.v_codeこれを回避するには、が NULLの場合を処理する必要があります。MySQL でこれを行う典型的な方法は、COALESCE 関数を使用することです。

SELECT CONCAT(u.first_name, ' ', u.last_name, '----', COALESCE(i.v_code,'')) as name, 
       u.id as id
FROM #__users as u
JOIN #__bl_match as m ON ( (u.team_id = m.team1_id) OR 
     (u.team_id = m.team2_id) OR 
     (u.team_id = m.team3_id AND m.team3_id != 0) OR 
     (u.team_id = m.team4_id AND m.team4_id != 0) OR 
     (u.team_id = m.team5_id AND m.team5_id != 0) OR 
     (u.team_id = m.team6_id AND m.team6_id != 0) OR
     (u.team_id = m.team7_id AND m.team7_id != 0) OR
     (u.team_id = m.team8_id AND m.team8_id != 0) OR 
     (u.team_id = m.team9_id AND m.team9_id != 0) OR
     (u.team_id = m.team10_id AND m.team10_id != 0)) 
   AND m.id = ".$t_id."AND m.id != 0 
LEFT JOIN #__bl_interview as i ON i.u_id = u.id"

ここで、名前に適用している書式設定を考えると、----名前の後に不要なものが残り、その後にインタビュー コードがない場合があります。それを避けたい場合は、 COALESCE の代わりにIFを使用して、出力を少し賢くすることができます。

SELECT CONCAT(u.first_name, ' ', u.last_name, IF(i.v_code, '---- ' + i.v_code, '')) as name

これが何をしているのかに注意してください:i.v_codeが NULL でない場合、IF の最初の式は true と評価されるため、2 番目の式が返されます。それ以外の場合は、3 番目の式 (空の文字列) が返されi.v_codeます。つまり、が NULL の場合、ユーザーの名前のみを出力します。

于 2012-09-20T23:17:56.480 に答える