#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. Стафанелли: Ваше предположение о принадлежности пользователей к определенной группе верно, Джо. Я просто упростил запрос с точки зрения того, чтобы вопрос казался завершенным