Простая проблема с MySQL Join - PullRequest
1 голос
/ 19 января 2010

Я озадачен этим простым запросом, потому что его я не пробовал раньше.

У меня есть таблица User, таблица User_Widget и таблица Widget.

Простое внутреннее объединение показывает мне, какие у них есть виджеты, путем присоединения user_widget.user_id = user.user_id.

Как бы показать виджеты в таблице виджетов, которых у них нет?

Ответы [ 6 ]

1 голос
/ 19 января 2010

Используйте CROSS JOIN и LEFT OUTER JOIN (это из моего опыта работы с MS SQL, но концепция должна выполняться).

Это работает так. Подзапрос получает все возможные комбинации пользователя и виджета.

LEFT OUTER JOIN объединяет ваши ассоциации User_Widgets.

Часть IS NULL WHERE CLAUSE исключит виджеты, которые есть у пользователя, предоставляя вам только те, которые не имеют.

SELECT allpossible.User_ID, allpossible.Widget_ID FROM
(
  SELECT User_ID, Widget_ID FROM
    Users
  CROSS JOIN
    Widgets
) allpossible
LEFT OUTER JOIN
  User_Widgets uw
ON
  allpossible.User_ID = uw.User_ID
AND allpossible.Widget_ID = uw.Widget_ID
WHERE
  uw.UserID IS NULL
1 голос
/ 19 января 2010

Посмотрите, ГДЕ НЕ СУЩЕСТВУЕТ, с помощью подвыбора в вашей документации.

0 голосов
/ 19 января 2010
SELECT *
FROM widgets w
LEFT OUTER JOIN user_widget uw 
ON w.id = uw.widget_id AND uw.user_id = 1 // or whatever user u want
WHERE uw.widget_id IS NULL;
0 голосов
/ 19 января 2010

Благодаря Барту Янсону я получил запрос:

SELECT * FROM widgets
WHERE NOT EXISTS (
SELECT * FROM widget_user
WHERE widgets.widget_id = widget_user.widget_id
AND user_id = "ID NUMBER OF PERSON YOU WANT"
)
ORDER BY RAND()
LIMIT 10

Ура, ребята

0 голосов
/ 19 января 2010
SELECT * FROM widgets WHERE id NOT IN
(
    SELECT widget_id FROM user_widgets WHERE user_id = 1
)

(где 1 - идентификатор интересующего вас пользователя)

0 голосов
/ 19 января 2010

Это предположение, (я не пробовал), но попробуйте это:

Select Distinct u.*, Z.*
From User u
   Left Join 
        (Select u.UserId, w.* 
         From Widget w
         Where Not Exists 
              (Select * From User_Widget
               Where userId = u.UserId 
                  And widgetId = w.WidgetId)) Z
    On Z.userId = u.UserId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...