如何有条件地加入不同的表格?

时间:2015-09-03 06:54:00

标签: mysql sql

我正在使用MySQL。

我有三个名为ratingsusers和一个主表master_entityType的表。

根据entityTable表的master_entityType列的值,我必须加入另一个表。如果master_entityType的值为"博客",则必须加入blogs表。如果master_entityType中的值是" items",我必须加入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          

在Items表中,

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

在博客表中,

blogID   name     active
   1    socail      1
   2    private     1

1 个答案:

答案 0 :(得分:1)

你的设计很奇怪,所以性能可能很差。

UNION ALL将两个表放在一起并加入结果。像这样的东西。 如果MySQL有视图,则创建联合ItemsBlogs表的视图,并在其他查询中使用该视图。它使查询更易于阅读,理解和维护。

这是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'