2014-10-27 4 views
0

У меня есть три таблицы, как эти:Условный Регистрация таблицы Структура

  1. PARTY_ANIMALS [ID, ...] -> содержит все животные, участвующие в партии

  2. DOGS [ID , id_dog, name_dog] -> содержит список собак с соответствующим названием

  3. CATS [ID, id_cat, name_c в] -> содержит список кошек с соответствующим названием

Я бы выполнить запрос, извлекающих PART_ANIMALS и присоединиться к СОБАКИ или CAT на основе некоторых значений в

PARTY_ANIMALS (то выполнение условного присоединитесь) и верните таблицу результатов таким образом:

RESULT_TABLE [animal_type, id (id_dog или id_cat), name (name_dog или name_cat)].

Каков правильный путь? Какие значения в таблице PARTY_ANIMALS мне нужно для правильного соединения с другими таблицами? и какой запрос мне нужно получить в моей таблице результатов?

+1

Почему вы не выбираете кошек и собак отдельно, а затем объединяете результаты? –

+0

Вы имеете в виду, если я создаю таблицы party_dogs и party_cats? то как я могу объединить его и получить значение animal_type в таблице результатов? – Domenico

+0

на стороне mysql do: SELECT ... PARTY_ANIMALS JOIN DOGS и второй запрос SELECT ... PARTY_ANIMALS JOIN CATS, а затем слить результирующие массивы в php или любой язык, который вы используете –

ответ

0

Я предложил бы использовать left join и coalesce():

select (case when id_cat is not null then 'Cat' else 'Dog' end) as animal_type, 
     coalesce(c.id_cat, d.id_dog) as id, 
     coalesce(c.name_cat, d.name_dog) as name 
from party_animals pa left join 
    cats c 
    on pa.id = c.id_cat left join 
    dogs d 
    on pa.id = d.id_dog; 

Это позволит SQL двигатель использовать индексы для join с.

Кроме того, вы должны быть достаточно осторожны, чтобы столбцы id в cats и dogs имели различные значения. Или, по крайней мере, пока ученые не придумают способ создать гибридную собаку-кошку.

0

Попробуйте это:

SELECT d_c.animal_type, 
     d_c.id, 
     d_c.name 
FROM party_animals a 
INNER JOIN (SELECT 'dog' animal_type, 
        id id_a, 
        id_dog id, 
        name_dog name 
      FROM dogs 
      UNION ALL 
      SELECT 'cat' animal_type, 
        id id_a, 
        id_cat id, 
        name_cat name 
      FROM cats 
      ) d_c ON a.id = d_c.id_a 
+0

это похоже, может быть решением ... но в этом случае что произойдет, если у меня будет то же самое и на собачьем столе, и на кошачьем столе? – Domenico

+0

соединение будет правильным, потому что он использует id (переименованный id_a), в вашей финальной таблице вы увидите собаку и кошку с тем же идентификатором (исходящим из colums id_dog или id_cat). Конечно, в этом случае конечный идентификатор не уникален, но пара animal_type-id - – mucio

+0

да, но как я могу получить правильную строку? Мне нужно добавочное значение в party_animal ... хорошая практика добавить поле type_animal в таблицу party_animal и сделать примерно следующее: – Domenico

Смежные вопросы