我正在使用MySQL。
我有三个名为ratings
,users
和一个主表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
答案 0 :(得分: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'