2011-07-07 9 views
4

現在のユーザーによって追加されていない、現在のユーザーがまだレビューしていない製品テーブル内の製品の結果を返そうとしています。最初は誰もいない。MySQL join issue

  • tblUsers

    UserID 
    1 
    2 
    3 
    
  • tblProducts

    ProductID UserID (created) NumberReviews 
    --------- ---------------- ------------- 
    1   1    1 
    2   1    0 
    3   2    1 
    4   1    2 
    5   2    0 
    
  • tblReviews

    ReviewID UserID(reviewed) ProductID 
    -------- ---------------- --------- 
    1  2    4 
    2  1    3 
    3  3    4 
    4  3    1 
    

だから2の現在のユーザーのために、私は別の左の数が参加したが、無駄にしようとしている

Product ID 
---------- 
2 
1 

を返すようにしたいです。何か案は?

+2

ヒント:それは簡単に例/コードに答えるために作るためにあなたの質問に各テーブルに名前を追加します。 –

+1

また、データ設定コードをいくつか含めると、応答が速くなります。 – SWeko

答えて

1
SELECT p.* 
    , COUNT(r.ProductID) AS reviews 
FROM tblProducts AS p 
    LEFT JOIN tblReviews AS r 
    ON r.ProductID = p.ProductID 
WHERE UserID <> @currentUser 
    AND NOT EXISTS 
    (SELECT * 
     FROM tblReviews ru 
     WHERE ru.ProductID = p.ProductID 
     AND ru.UserID = @currentUser 
    ) 
GROUP BY p.ProductID 
ORDER BY reviews ASC 

あなたはカウントしない場合が、使用フィールドNumberReviewsを注文すると、簡単です:

SELECT p.* 
FROM tblProducts AS p 
WHERE UserID <> @currentUser 
    AND NOT EXISTS 
    (SELECT * 
     FROM tblReviews ru 
     WHERE ru.ProductID = p.ProductID 
     AND ru.UserID = @currentUser 
    ) 
ORDER BY NumberReviews ASC 
+0

ありがとうございました –

1

で試してみてください:

SELECT u.*, p.*, r.* FROM users u 
    LEFT JOIN products p ON p.userId <> u.userID 
    LEFT JOIN reviews r ON (r.productId = p.ProductID AND r.UserID = u.userID) 
GROUP BY p.productID ORDER BY p.NumberReviews 
0

これらの線に沿って何かが(mysqlのわからSQL Serverの構文ではなく)を働くかもしれない

Select productID 
    from Users u 
    -- all products not created by user 
    inner join Products p on p.UserID != u.UserID 
    -- that were reviewed by the user. NOT! 
    left outer join Reviews r on p.ProductID = r.ProductID and r.UserID = u.UserID 
    where r.ReviewID is null 
    and User = CurrentUser 
0

私は何も逃さなかった場合:

SELECT 
    p.ProductID 
FROM tblProducts p 
    LEFT JOIN tblReviews r ON p.ProductID = r.ProductID AND r.UserID = @UserID 
WHERE p.UserID <> @UserID 
    AND r.ReviewID IS NULL 
ORDER BY p.NumberReviews