2015-09-03 5 views
1

Я использую MySQL.Как присоединиться к разным таблицам?

У меня есть три стола с именем ratings, users и одна основная таблица master_entityType.

В зависимости от значений от entityTable столбец таблицы master_entityType, я должен присоединиться к другой таблице. Если значения от master_entityType - это «Блоги», я должен присоединиться к таблице blogs. Если значения из master_entityType являются «элементами», я должен присоединиться к таблице items.

SELECT * FROM ratings AS r 
    LEFT JOIN users AS u ON u.userID = r.userID 
    LEFT JOIN master_entityType AS ms ON ms.entityTypeID = r.entityTypeID 
    CASE ms.entityTable 
     WHEN 'Blogs' THEN INNER JOIN blogs AS b ON b.blogID = r.entityID 
    END 
WHERE r.entityTypeID = '10' AND r.entityID = '1' AND r.userID = '1' 

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

Структура таблицы следующим образом,

В таблице пользователей,

UserID userName isActive 
1  Dinesh 1 
2  Kumar  1 

В таблице оценок,

ratingID entityID entityTypeID userID rating 
    1   1   1   1  5 
    2   4   2   1  4 

В master_entityType таблице

entityTypeID entityTable entityTypeName entityTypeDescription active 
     1   blogs   Blogs    Null    1 
     2   items   Items    Null    1   

В Элементы t состоянии,

ItemID name collection  active 
    4 pencil  12   1 
    5  pen   06   1 

В блогах таблице

blogID name  active 
    1 socail  1 
    2 private  1 
+1

Просто используйте 'LEFT JOIN', но ваша попытка выглядит странно - * все * строки, возвращаемые запросом, должны быть одного типа. – zerkms

+0

Дайте мне скрипт SQL для схемы таблиц и некоторых фиктивных данных, я сделал такой вид на вещи в моем проекте –

+0

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

ответ

1

Ваш дизайн странно, так что производительность может быть бедным.

UNION ALL две таблицы вместе и объединяйтесь с результатом. Что-то вроде этого. Если у MySQL есть представления, тогда создайте представление, которое объединяет таблицы Items и Blogs, и используйте представление в других запросах. Это упрощает чтение, понимание и поддержку запросов.

Адрес SQL Fiddle. Я скорректировал условие WHERE в скрипке, потому что данные образца не имеют никаких строк с entityTypeID = 10.

SELECT * 
FROM 
    ratings AS r 
    LEFT JOIN users AS u ON u.userID = r.userID 
    LEFT JOIN master_entityType AS ms ON ms.entityTypeID = r.entityTypeID 
    INNER JOIN 
    (
     SELECT 
      ItemID AS EntityID 
      ,'Items' AS EntityTypeName 
      ,name 
      ,active 
     FROM items 

     UNION ALL 

     SELECT 
      BlogID AS EntityID 
      ,'Blogs' AS EntityTypeName 
      ,name 
      ,active 
     FROM blogs 
    ) AS Entities ON 
     Entities.EntityTypeName = ms.entityTypeName 
     AND Entities.EntityID = r.entityID 
WHERE r.entityTypeID = '10' AND r.entityID = '1' AND r.userID = '1' 
+0

Есть ли способ присоединиться к таблицам с помощью операторов case? –

+0

@ Dineshkumar, я не думаю, что можно использовать инструкцию 'CASE', как вы хотите. Это просто не работает. 'CASE' возвращает некоторое значение, например' int' или 'varchar', это не конструкция управления потоком, как' IF'. –

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