[英]How to join conditionally with different tables?
我正在使用MySQL。
我有一个名为三个表ratings
, users
和一个主表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.