Предположим, у меня есть база данных с названием clubmembership
которой есть столбец для имен, столбец для клубов и столбец для той роли, которую они играют в этом клубе. Название Маргрит будет в колонке name
много раз, или столько раз, сколько она в клубе. Если я хочу посмотреть, какие люди являются членами швейного клуба, мой запрос может выглядеть примерно так:
SELECT DISTINCT NAME FROM CLUBMEMBERSHIP
WHERE CLUB=SEWING
AND ROLE=MEMBER;
Моя проблема в том, что я не могу понять, кто не в швейном клубе. Конечно, простое предложение "не в" не работает, потому что есть много строк, в которых нет шитья. В этой базе данных, если кто-то не в швейном клубе, шитье не появляется под клубом, поэтому я полагаю, что есть способ присоединиться к различным строкам с тем же именем под "именем", а затем потенциально использовать предложение "не в"
Надеюсь, это было хорошим объяснением этого вопроса. Некоторое время я боролся с этой проблемой.
Спасибо за вашу помощь! Nicolle
Это не то, что можно решить, просто изменив существующий код, это связано с дизайном базы данных.
Нормализация базы данных - это процесс сортировки вашей базы данных в разумные таблицы.
Если вы добавляете человека много раз, то вместо этого вы должны создать таблицу с именем members
. И если есть список клубов, то вам следует создать таблицу clubs
.
Затем вы можете создать таблицу, чтобы объединить их.
Вот ваши три стола:
members
-------
id (int)
name (varchar)
clubs
-------
id (int)
name (varchar)
memberships
-------
member_id (int)
club_id (int)
Затем вы можете использовать объединения в MySQL для возврата необходимой вам информации.
Qaru не любит внешние ссылки, так как ответ должен быть здесь, но это огромная тема, которая не вписывается в один ответ, поэтому я бы кратко прочитал о нормализации базы данных, а затем прочитал о "объединении таблиц".
Если вы правильно поняли, вы хотели бы перечислить все имена, которые не являются членами SEWING
. Внутренний запрос получит все Имена, которые являются членами SEWING
, однако оператор NOT EXISTS
получит все Имена, которые не найдены во внутреннем запросе.
SELECT DISTINCT C.NAME
FROM CLUBMEMBERSHIP C
WHERE C.ROLE = 'MEMBER'
NOT EXISTS
(
SELECT NULL
FROM CLUBMEMBERSHIP D
WHERE D.CLUB='SEWING'
AND D.ROLE='MEMBER'
AND C.NAME = D.NAME
)
Вот демо.