2012-01-31 1 views
1

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

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

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

ing_eff_xref: eff_id, ing_id

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

Вот туздЫшпр из БД, если кому-то интересно: http://dl.dropbox.com/u/59699040/alchemy_db.sql

ответ

1

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

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

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

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

есть запрос, который может принимать набор 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 i.ing_name IN ('Abecean Longfin ','Eye of Sabre Cat ','Bear Claws '); 

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

Может ли эффект воздействия зелье в Skyrim? Если они в суммируется, то вы можете сделать 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 работает так или нет, но это была просто дополнительная мысль.

+0

Спасибо, что вернулись ко мне. Второй запрос, безусловно, является приемлемым решением. Эффекты не складываются, но может быть больше одного эффекта, который соответствует, поэтому я могу просто вытащить любые эффекты с числом больше 1 в php. Я не уверен, что происходит в первом запросе, но я думаю, что мне понадобится противоположность SELECT DISTINCT, если такая вещь существует. Спасибо за помощь, это был глаз. – pdizz

+0

Эй, рад помочь! Это было весело для работы. – Aaron

+0

Теперь, когда я знаю, что искать, я нашел эту статью о поиске дубликатов http://www.petefreitag.com/item/169.cfm, похоже, я мог добавить HAVING (COUNT (email)> 1), но используя eff_name для сузить. – pdizz