2017-03-05 10 views
1

私は現在のユーザがどのユーザの役割に属しているかを示すPHPスクリプトを作成しています。 データはmySQLにあり、私が望むのは、使用可能なすべてのロールを表示し、すべてのロールを表示し、ユーザーの所在を示します。なぜこのmySQL LEFT JOINは機能しませんか? WHERE句にすることはできますか?

これは、ここでは役割がある

CREATE TABLE roles(
    roleID int unsigned not null auto_increment primary key, 
    nombreRol char(50) not null 
) 

私の役割テーブルです:

registered 
pending 
student 
former-student 

、これは役割テーブル

CREATE TABLE rolesUsuarios (
    rolesUsuariosID int unsigned not null auto_increment primary key, 
    userID int not null, 
    nombreRol char(50) not null 
) 
でusuariosテーブルを接続するテーブルであります

私はLEFTを作成しようとしているが、このように登録しよう:

SELECT 
roles.nombreRol, 
rolesUsuarios.userID 
FROM roles 
LEFT JOIN rolesUsuarios 
ON roles.nombreRol = rolesUsuarios.nombreRol 
WHERE rolesUsuarios.userID = 183 

(私はちょうどクエリが動作していることを確認し、現時点では、セキュリティに関係していないよ)の例では

、ユーザ183はロールの学生と登録しています。

意図した結果は次のようにする必要があります:

nombreRol -------- userID 
registered ------- 183 
pending ---------- NULL 
student ---------- 183 
former-student --- NULL 

しかし、私は代わりに、この結果を得る:

nombreRol -------- userID 
registered ------- 183 
student ---------- 183 

にはどうすれば参加変更されることがあり?あなたのwhere句がinner joinleft joinを回している

+1

'OR .... IS NULL' –

+0

@ PM77-1 - Nope。 – GurV

答えて

1

(私は例hereに従ったのだが、そこに動作しません、と私は私が正しく、クエリのロジックを追ってきたと思います)。代わりに、結合のON句にそれを追加してください。

はこれを試してみてください:

SELECT 
roles.nombreRol, 
rolesUsuarios.userID 
FROM roles 
LEFT JOIN rolesUsuarios 
ON roles.nombreRol = rolesUsuarios.nombreRol 
AND rolesUsuarios.userID = 183 
+0

ありがとう、それは動作します! where句がクエリに対してなぜそれを行うのですか?ありがとうございました!! – Rosamunda

+1

@Rosamunda - 'where'節が結合の後に適用されるためです。右側の表の左側の表に一致する値がない場合、rightTable.userIdの値はNULLになります。したがって、nullを183と比較すると、falseと評価され、その結果行は結果から除外されます。 'ON'句は、テーブルが結合されている間に評価されます。それで、それはそこで正しく動作します。 – GurV

+0

ありがとう@ GurV !!!! – Rosamunda

0

私は結果が正しいthinhk。期待される結果を得るには、WHERE条件は次のようになります。 rolesUsuarios.userID = 183またはrolesUsuarios.userIDがNULLの場合

関連する問題