MySQL加入问题

时间:2011-07-07 09:33:44

标签: mysql join

我正在尝试返回产品表中未被当前用户添加的产品结果以及当前用户尚未审核的产品结果,然后按照评论最少的产品排序第一

  • 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

我尝试了许多不同的左连接,但无济于事。有什么想法吗?

4 个答案:

答案 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

答案 1 :(得分: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

答案 2 :(得分:0)

这些内容可能有用(sql server语法,不确定mysql)

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

答案 3 :(得分: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