Mysql 如何有条件地连接不同的表?
我正在使用MySQL 我有三个名为Mysql 如何有条件地连接不同的表?,mysql,sql,Mysql,Sql,我正在使用MySQL 我有三个名为ratings、users的表和一个主表master\u entityType 根据master\u entityType表的entityTable列中的值,我必须与另一个表联接。如果master\u entityType中的值是“Blogs”,我必须加入Blogs表。如果master_entityType中的值为“items”,则我必须与items表连接 SELECT * FROM ratings AS r LEFT JOIN users AS u O
ratings
、users
的表和一个主表master\u entityType
根据master\u entityType
表的entityTable
列中的值,我必须与另一个表联接。如果master\u 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
在blogs表中
blogID name active
1 socail 1
2 private 1
您的设计很奇怪,因此性能可能很差
将所有
两个表合并在一起并与结果合并。像这样的。
如果MySQL有视图,则创建包含项
和博客
表的视图,并在其他查询中使用该视图。它使查询更易于阅读、理解和维护
这是。我在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'
只需使用LEFT JOIN
,但您的尝试看起来很奇怪-查询返回的所有行必须是相同的类型。请为表架构和一些虚拟数据提供SQL FIDLE,我在我的项目中做过类似的事情,您会遇到什么错误?这是主要的信息开始,你忘了把它的问题。。。请把它添加到问题中,不要把它放在评论中。@Paolo我得到了这个错误。查询:从分级为r left Join users as u on u.userID=r.userID left Join master\u entityType as ms on ms.entityTypeID=r.e.中选择*错误代码:1064您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,了解在“blogs”时使用“case ms.entityTable”的正确语法,然后在第5行以b.blogsID=r.e的形式将blogs内部连接为b。您可以发布所需的结果吗?有什么方法可以使用case语句连接表吗?@Dineshkumar,我认为不可能按照您的意愿使用CASE
语句。它根本不是这样工作的CASE
返回一些值,例如int
或varchar
,它不是像IF
那样的流控制构造。