Новичок в MySQL ищет запрос отношения «многие ко многим» - PullRequest
1 голос
/ 31 января 2012

Некоторые сведения У меня есть набор данных, которые представляют ингредиенты алхимии и их эффекты от Skyrim. Если вы не знакомы с этим, вы можете объединить 2-4 ингредиента, чтобы приготовить зелье. Каждый ингредиент имеет 4 эффекта. Если какие-либо эффекты между ингредиентами одинаковы, то получится зелье такого типа. Я определил это как отношение «многие ко многим» и настроил свои таблицы следующим образом:

ингредиенты: ing_id (ключ), ing_name, (другая дополнительная информация)

эффекты: eff_id (ключ), eff_name

ing_eff_xref: eff_id, ing_id

Я хотел бы ввести 2 или более доступных ингредиентов и вернуть возможные комбинации, не зная, каковы эффекты. Мой опыт работы с sql в значительной степени ограничен phpmyadmin и простыми запросами select. Я предполагаю, что мои вопросы: это правильный способ структурировать таблицы для этого типа отношений, нужно ли мне устанавливать внешние ключи, если я не планирую обновлять таблицы, и есть ли запрос, который может принять набор ing_names и возвращать только eff_names, которые пересекаются?

Вот mysqldump базы данных, если кому-то интересно: http://dl.dropbox.com/u/59699040/alchemy_db.sql

1 Ответ

1 голос
/ 31 января 2012

это правильный способ структурировать таблицы для этого типа отношений?

Да, но тогда вам не нужно иметь эффект от 1 до 4 на столе с ингредиентами.

нужно ли устанавливать внешние ключи, если я не планирую обновлять таблицы?

Да. Единственный способ получить данные, которые вам нужны, - это объединить три таблицы. Без внешних ключей (или, более конкретно, соответствующих индексов) это может плохо работать с запросами. Конечно, в целом у вас есть небольшое количество строк, но использование внешних ключей является хорошей практикой, которой нужно следовать в сценарии такого типа.

существует ли запрос, который может принимать набор имен ing_names и возвращать только eff_names, которые пересекаются?

Я думаю, что вы ищете что-то вроде этого:

SELECT e.eff_name
FROM ingredients i
INNER JOIN ing_eff_xref ie ON ie.ing_id = i.ing_id
INNER JOIN effects e ON e.eff_id = ie.eff_id
WHERE i.ing_name = 'Abecean Longfin ';

Если вам нужно увидеть эффекты для нескольких ингредиентов, вы можете настроить выражение WHERE следующим образом:

WHERE i.ing_name IN ('Abecean Longfin ','Eye of Sabre Cat ','Bear Claws ');

Возможно, вам не понадобятся повторяющиеся эффекты, поэтому вы можете выполнить команду SELECT DISTINCT, чтобы устранить их.

Могут ли эффекты зелья складываться в Скайриме? Если они в стеке, то вы можете выполнить запрос GROUP BY с COUNT, чтобы получить суммированное значение каждого эффекта:

SELECT e.eff_name, count(*) as value
FROM ingredients i
INNER JOIN ing_eff_xref ie ON ie.ing_id = i.ing_id
INNER JOIN effects e ON e.eff_id = ie.eff_id
WHERE i.ing_name IN ('Eye of Sabre Cat ','Bear Claws ')
GROUP BY e.eff_name;

В этом запросе будут перечислены 6 эффектов со значением 1, а у «Восстановить выносливость» будет значение 2. Не уверен, работают ли зелья Skyrim таким образом или нет, но это была просто дополнительная мысль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...