2016-04-07 14 views
1

Neden bu iki sorgu role için farklı sonuçlar veriyor?Bu 2 SQL sorgusu farklı bir sonuç döndürüyor

SAĞ sonuç (rol haklı kullanıcıya ilişkilidir):

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 

yanlış sonuç (rol her roles tablonun ilk kayıttır):

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 

İlk sorguyu kullanamıyorum (WHERE role_users.user_id = users.id ile) ve ikinciyi kullanmak zorundayım ('JOIN' ile): Doğru sonuca nasıl ulaşılır?

Teşekkür

DÜZENLEME: cevaplamak için yorumlar:

  1. I can't use the first query vasıta, kısacası, ben laravel Sorgusu ->where('role_users.user_id', '=', 'users.id') çevrildi ifadesini WHERE role_users.user_id = users.id, laravel Sorgu Oluşturucu ile inşa ve ediyorum Oluşturucu, işe yaramıyor çünkü WHERE role_users.user_id = 'users.id' gibi kullanılıyor. Raw() işlevini kullanabilirim ama bundan kaçınmak ve daha iyi bir çözüm aramak istiyorum.
  2. Veritabanı şemasını oluşturmama rağmen Cartalyst Sentinel;
+4

Ne demek 'İlk sorguyu kullanamıyorum', bu size Doğru sonucu verirse sorun nedir? –

+0

SİPARİŞ BY olmadan LIMIT'in oldukça anlamsız bir kavram olduğunu unutmayın. Bu örnekte, LIMIT'in ne yapması gerektiğini göremiyorum. Kısacası, her iki sorgu da doğru bir sonuç verirse, niyetten ziyade bir şanstır. – Strawberry

cevap

0

Sizin alt sorgu (bir ORDER BY roles.id yoktu gibi) bir çok-çok ilişki var ama ben her kullanıcı yalnızca bir role sahiptir özen ve bir kullanıcı daha bu bir role sahipse, iyi, ilk almak Ana sorgunuza katılmıyor, bu yüzden kullanıcıları bir araya getirmiyor. Harici sorgudan

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 

İkinci sorgu kullanıcıyı kullanırken

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 ... bu mantıklı ama ben bir "[Err] 1066 - Benzersiz bir tablo/takma ad: 'kullanıcı'" – Ivan

+0

SQL Düzenlendi. Tekrar dene ve çalışırsa bana haber ver. – Namrehs

+0

bu sefer şunu elde ettim: '[Err] 1064 - SQL sözdiziminizde bir hata var; '(SELECT roles.name rolleri INNER JOIN role_use' satır 4 ' – Ivan

0

İlk sorgu kullanıcı tablosundan ilk rolünü seçin ve her satır için aynıdır: Bu deneyin.

+0

' yanında kullanmak için doğru sözdizimi için MySQL sunucu sürümünüze karşılık gelen kılavuzu kontrol edin. Bunun için bir çözüm var mı? – Ivan

İlgili konular