繁体   English   中英

如何有条件地与不同的表联接?

[英]How to join conditionally with different tables?

我正在使用MySQL。

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

根据master_entityType表的entityTable列中的值,我必须与另一个表连接。 如果master_entityType值为“ Blogs”,则必须加入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          

在项目表中,

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

在博客表中,

blogID   name     active
   1    socail      1
   2    private     1

您的设计很奇怪,因此性能可能很差。

UNION ALL两个表UNION ALL在一起,并与结果联接。 这样的事情。 如果MySQL具有视图,则创建一个将Items and 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'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM