2016-04-07 37 views
1

roleのこれら2つのクエリが異なる結果をもたらす理由を教えてください。これらの2つのSQLクエリは異なる結果を返します

RIGHT結果(役割を正しくユーザに関連付けられている):

SELECT 
    users.*, 
    activations.id AS activation 
    (SELECT 
     roles.name 
    FROM roles 
    INNER JOIN role_users ON roles.id = role_users.role_id 
    WHERE role_users.user_id = users.id 
    LIMIT 1) AS role 
FROM users 
LEFT JOIN activations ON users.id = activations.user_id 

WRONG結果(役割は常にrolesテーブルの最初のレコードである):

SELECT 
    users.*, 
    activations.id AS activation 
    (SELECT 
     roles.name 
    FROM roles 
    INNER JOIN role_users ON roles.id = role_users.role_id 
    INNER JOIN users ON users.id = role_users.user_id 
    LIMIT 1) AS role 
FROM users 
LEFT JOIN activations ON users.id = activations.user_id 

私は最初のクエリを使用することはできません(WHERE role_users.user_id = users.id)と私は2番目を使用する必要があります( 'JOIN'):正しい結果を達成するには?

おかげ

EDIT:コメントに答えるために:私はLaravelクエリビルダでそれを構築し、そして表現WHERE role_users.user_id = users.id、Laravelクエリに->where('role_users.user_id', '=', 'users.id')に翻訳していますという短い中

  1. I can't use the first query手段、 Builderは、あたかもWHERE role_users.user_id = 'users.id'のように処理されるため、動作しません。 whereRaw()を使用できますが、これを避けてより良い解決策を探したいのですが
  2. 私はデータベーススキーマを構築しませんでしたが、Cartalyst Sentinelから来ました。
+4

「最初のクエリを使用できません」とは、問題が何か正しい結果をもたらすかどうかということです。 –

+0

ORDER BYのないLIMITはかなり意味がないことに注意してください。この例では、LIMITが何をしているのか分かりません。要するに、いずれかのクエリが正しい結果を返す場合、それは意図ではなく運が必要です。 – Strawberry

答えて

0

あなたのサブクエリ(ORDER BY roles.idがあったとして)それは、多対多の関係だが、私は、すべてのユーザーが1つのロールのみを持って世話をし、ユーザーはより多くのその1つの役割を持っている場合は、よく、最初に取りますメインクエリに参加していないので、ユーザー同士を結びつけることはありません。あなたは、外部クエリから

SELECT 
    /
    (SELECT 
     roles.name 
    FROM roles 
    INNER JOIN role_users ON roles.id = role_users.role_id 
    WHERE role_users.user_id = users.id 
           ^^^^ -- external query user_id 
    LIMIT 1) AS role 
FROM users --- you use this user, so each row has a different user_id 
LEFT JOIN activations ON users.id = activations.user_id 

2番目のクエリを、ユーザーを使用している

SELECT 
     u.*, 
     activations.id AS activation 
     (SELECT 
      roles.name 
     FROM roles 
     INNER JOIN role_users ON roles.id = role_users.role_id 
     INNER JOIN users u1 ON u1.id = role_users.user_id AND u1.id = u.id 
     LIMIT 1) AS role 
    FROM users u 
    LEFT JOIN activations ON u.id = activations.user_id 
+0

Uhm ...これは理にかなっていますが、「[Err] 1066 - ユニークでないテーブル/エイリアス: 'users'」が表示されます – Ivan

+0

SQLを編集しました。もう一度やり直してみてください。 – Namrehs

+0

今回は次のように表示されます。 '[Err] 1064 - SQL構文に誤りがあります。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックし、正しい構文が近くで使用できるようにしてください。 '(SELECT roles.name FROM roles INNER JOIN role_use at 4行目' – Ivan

0

まずクエリを使用すると、ユーザテーブルから最初の役割を選択して、すべての行で同じです:これを試してみてください。

+0

これには解決策がありますか? – Ivan

関連する問題