MySQL присоединиться к вопросу - PullRequest
4 голосов
/ 07 июля 2011

Я пытаюсь вернуть результаты продуктов в таблице продуктов, которые не были добавлены текущим пользователем и которые текущий пользователь еще не просмотрел, а затем отсортировать по продуктам, у которых было наименьшее количество отзывов, показывая те, у которых их нет первый.

  • 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 ]

1 голос
/ 07 июля 2011
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
1 голос
/ 07 июля 2011

Попробуйте с:

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 голосов
/ 07 июля 2011

Если я ничего не пропустил:

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
0 голосов
/ 07 июля 2011

Что-то в этом духе может работать (синтаксис сервера sql, не уверен насчет 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...