#php #mysql #sql #database #categories
#php #mysql #sql #База данных #Категории
Вопрос:
Для сайта, над которым я работаю, я хочу, чтобы пользователь имел возможность отмечать несколько полей, которые представляют то, что его / ее может заинтересовать, подобно StumbleUpon. Пользователь должен проверить «веб-разработка» и «веб-дизайн», затем нажать «Отправить», который затем сохранит его предпочтения в базе данных.
Позже, если кто-то создаст проект, помеченный одним из выбранных им параметров, этот пользователь получит обновление. Итак, если бы я создал новый проект с надписью «Создание веб-сайта» и проверил категорию «веб-разработка», все пользователи, у которых в личных профилях было выбрано «веб-разработка», получили бы какое-нибудь сообщение или электронное письмо, предупреждающее их о недавно созданной теме.
Каков наилучший способ реализовать это в формате MySQL? Я просмотрел несколько страниц по управлению иерархическими данными (там будут общие категории, такие как «Компьютеры» или «Музыка», и администратор сможет добавлять / удалять / редактировать категории), но ни один из методов не показался мне тем, что мне нужно — по крайней мере, не в том смысле, в котором я застрял. Возможно, есть более простой ответ, который я упустил из виду?
Ответ №1:
Создайте таблицу, содержащую различные интересы. Скажите
Interests :- id, interest
Затем таблица, в которой хранятся все интересы, выбранные пользователем, как
UserInterests :- user_id, interest_id
И отношение интереса к проекту как
ProjectInterest :- project_id, interest_id
Теперь, когда добавлен новый проект, вы можете запустить запрос, подобный следующему onw, чтобы сообщить пользователям, что проект представляет интерес
SELECT DISTINCT user_id
FROM UserInterests ui, ProjectInterests pi
WHERE ui.interest_id = pi.interest_id AND pi.project_id = <new project id>
Или, используя явный синтаксис объединения:
SELECT DISTINCT user_id
FROM UserInterests ui
INNER JOIN ProjectInterests pi ON ui.interest_id = pi.interest_id
WHERE pi.project_id = <new project id>
Комментарии:
1. DISTINCT всегда применяется ко всей строке, а не к определенному столбцу, поэтому нет необходимости заключать имя столбца в квадратные скобки, например
DISTINCT(user_id)
.
Ответ №2:
Я думаю, вы спрашиваете о том, как реализовать отношение «многие ко многим». Проблема в том, что вы не можете предоставить пользователю список интересов, не ограничивая себя точным количеством интересов, которые он может выбрать.
Решением является таблица соединений. С одной стороны, у вас есть свой список пользователей, а с другой стороны, у вас есть свой список интересов. Таблица соединений — это третья таблица, в которой перечислены отношения между этими двумя группами.
CREATE TABLE `user_interest` (
userid UNSIGNED INT REFERENCES `user` (userid),
interestid UNSIGNED INT REFERENCES `interests` (interestid),
PRIMARY KEY (interestid, userid)
)
Теперь у вас есть список УНИКАЛЬНЫХ комбинаций пользователей и интересов. Допустим, у вас есть список новостных статей, каждой из которых присвоена отдельная тема («interestid»). Теперь вы можете сделать что-то вроде,
SELECT * FROM `article` WHERE `article`.`interestid` IN (
SELECT `interestid` FROM `user_interest` WHERE `userid` = X
)
Которая извлекает список статей, связанных с выбранными интересами пользователя X. Сначала вы получаете список тем, которые были связаны с указанным вами пользователем, затем вы получаете список статей с соответствующими темами.