Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何有条件地连接不同的表?_Mysql_Sql - Fatal编程技术网

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

我正在使用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 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
那样的流控制构造。