реляционный вопрос mysql. Получаем результаты при M: N null

#mysql #sql #join #null #relational-database

#mysql #sql #Присоединиться #null #реляционная база данных

Вопрос:

-Цель-

Я хотел бы получить пользователей, у которых нет записи в таблице ‘bar’. Эти пользователи также будут принадлежать к определенной «группе пользователей» и будут иметь ограничения в самой таблице «user».

Упрощенная структура таблицы

Пользователь

 userid - auto-increment    
username - string    
userage - integer    
usergroup_usergroupid - foreign key
  

группа пользователей

 usergroup - auto-increment    
usergroupname - string
  

user_has_bar

 user_userid - foreign key    
bar_barid - foreign key
  

-Query…so далеко-

 SELECT username     
FROM user as u, usergroup as ug, user_has_bar as ub    
WHERE    
u.usergroup_usergroupid = ug.usergroupid AND    
u.userage = 10 AND  <-- lets pretend this exists    
u.location_locationid = 1 AND <-- Same here     
u.userid ... ub.user_userid;
  

-Головная боль-

Именно эта последняя строка заставляет меня выдавать пробелы. Из того, что я прочитал, я полагаю, что способ выполнить эту операцию заключается в соединении по ЛЕВОМУ краю. Однако все, что я прочитал до сих пор, в конечном итоге оказывается довольно запутанным.

Если возможно, я хотел бы сохранить эту операцию в запросе MySQL, а затем оптимизировать позже.Он создается с помощью генератора PHP MySQL, который я закодировал, и я хотел бы понять простой синтаксис, а затем углубиться в него. Любой подход ОЧЕНЬ приветствуется, хотя

Любезно благодарим вас за прочтение этого вопроса.

Комментарии:

1.Реляционный ответ: антисоединение user и user_has_bar , но мне кажется, вы все-таки задаете не реляционный вопрос 😉

Ответ №1:

 SELECT username
    FROM user u
        INNER JOIN usergroup ug
            ON u.usergroup_usergroupid = ug.usergroupid 
        LEFT JOIN user_has_bar ub
            ON u.userid = ub.user_userid
    WHERE u.userage = 10
        AND u.location_locationid = 1
        AND ub.user_userid IS NULL
  

Комментарии:

1. Вау, ты быстро перезвонил мне с ответом! Большое вам спасибо. Я просто попробую это и опубликую результат. Что я бы сказал после быстрого ознакомления, это выглядит элегантным и простым решением, часто лучшим

2. @Simon Ball: В качестве дополнительного примечания я не уверен, что ВНУТРЕННЕЕ соединение с usergroup вообще необходимо, поскольку вы, похоже, не ссылаетесь ни на какие столбцы из этой таблицы, если только вы просто не пытаетесь гарантировать, что пользователь назначен в группу.

3. Ответ с пятью звездами, он отлично сработал. Большое тебе спасибо, Джо. Налейте мне пива!

4. Стафанелли: Ваше предположение о принадлежности пользователей к определенной группе верно, Джо. Я просто упростил запрос с точки зрения того, чтобы вопрос казался завершенным