2009-08-23 5 views
1

У меня есть indextable, который содержит content_id и тип colomn. (например, content_id = 1, type = audio. Content_id = 1, type = video) Можно ли получить правильные данные на основе content_id из правых таблиц (таблицы: contentvideo, contentaudio)?MySQL Множественный выбор

+0

Вы можете точно определить, какие у вас есть таблицы и какие поля у них есть? –

+1

Я добавил тэг 'polymorphic-association', потому что это то, что вы делаете. Следуйте тегу, чтобы увидеть другие вопросы, связанные с этим дизайном базы данных. –

ответ

0

Вы пробовали CASE, или ЕСЛИ?

http://dev.mysql.com/doc/refman/6.0/en/case-statement.html

+1

Я прочитал в MysSQL ссылку, которую вы дали. Концепция понятна, примеры плохие, но я сделал некоторые поиски, и я нашел то, что мне нужно, основываясь на вашем жесте CASE. Благодаря! Для других людей, которые могут наткнуться на одно и то же. Вот ссылка, которая мне нужна (SELECT на основе CASE-переключателя) http://forums.mysql.com/read.php?10,245909,245990#msg-245990 – 2009-08-23 18:48:34

+0

Ну, не проблема! ;) –

1

Я понимаю, что вы хотите, чтобы извлечь содержимое с помощью одного оператора выбора? Если расположение таблиц контента точно так же, вы можете использовать UNION:

SELECT ca.* FROM contentaudio ca, indextable it 
WHERE ca.content_id = it.content_id 
    AND it.content_type = 'audio' 
UNION 
SELECT cv.* FROM contentvideo cv, indextable it 
WHERE cv.content_id = it.content_id 
    AND it.content_type = 'video' 
ORDER BY content_id /* or whatever */ 

Обратите внимание, что если content_id не является уникальным во всех ваших content таблиц, вы можете получить несколько записей (различных типов) для того же content_id. Также обратите внимание, что если вы выбираете конкретную запись на основе некоторого indextable ключа, вам нужно добавить ее к каждой части объединения.

Если content таблицы имеют различные макеты, вы можете использовать OUTER JOIN вместо Извлекайте и различные типы контента в рамках одной записи (отсутствующие файлы будут возвращены в качестве значения NULL):

SELECT * FROM indextable it 
    LEFT OUTER JOIN contentaudio ca ON it.content_id = ca.content_id 
    LEFT OUTER JOIN contentvideo cv ON it.content_id = cv.content_id 
WHERE it.some_key = ? 

Обратите внимание, что content_type вообще не участвует в этом случае (и вам это действительно не нужно для UNION).