Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.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/79.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 如何将SELECT CASE与子查询一起使用_Mysql_Sql - Fatal编程技术网

Mysql 如何将SELECT CASE与子查询一起使用

Mysql 如何将SELECT CASE与子查询一起使用,mysql,sql,Mysql,Sql,我的SELECT查询有问题。我尝试检索标记值名称“CallsBy”,但仅当该值为“入口点”时,否则我希望通过另一个子查询计算调用 我有三张桌子: t_object:包含所有类 t_操作:在所有操作中,链接到t_object.object_ID=t_operation.object_ID t_operationtag:使用每个操作的所有标记值,链接到t_operation.OperationID=t_operationtag.ElementID 以下是我的表格演示: 第1类的结果是: Name

我的SELECT查询有问题。我尝试检索标记值名称“CallsBy”,但仅当该值为“入口点”时,否则我希望通过另一个子查询计算调用

我有三张桌子:

  • t_object:包含所有类
  • t_操作:在所有操作中,链接到t_object.object_ID=t_operation.object_ID
  • t_operationtag:使用每个操作的所有标记值,链接到t_operation.OperationID=t_operationtag.ElementID
  • 以下是我的表格演示:

    第1类的结果是:

    Name Operation   | CallsBy
    -----------------+------------------------------------
    class1Operation1 | class2Operation2, class3Operation1
    class1Operation2 | class2Operation3
    class1Operation3 | class2Operation3
    
    Name Operation   | CallsBy
    -----------------+----------------------------------------------------
    class2Operation1 | class1Operation1, class3Operation1,class3Operation3
    class2Operation2 | Entry point of Tabidi
    class2Operation3 | class1Operation1
    
    Name Operation   | CallsBy
    -----------------+---------------------------------------
    class3Operation1 | class1Operation2, class3Operation1
    class3Operation2 | Entry point of Tabada
    class3Operation3 | class2Operation1
    
    第2类的结果是:

    Name Operation   | CallsBy
    -----------------+------------------------------------
    class1Operation1 | class2Operation2, class3Operation1
    class1Operation2 | class2Operation3
    class1Operation3 | class2Operation3
    
    Name Operation   | CallsBy
    -----------------+----------------------------------------------------
    class2Operation1 | class1Operation1, class3Operation1,class3Operation3
    class2Operation2 | Entry point of Tabidi
    class2Operation3 | class1Operation1
    
    Name Operation   | CallsBy
    -----------------+---------------------------------------
    class3Operation1 | class1Operation2, class3Operation1
    class3Operation2 | Entry point of Tabada
    class3Operation3 | class2Operation1
    
    第3类的结果是:

    Name Operation   | CallsBy
    -----------------+------------------------------------
    class1Operation1 | class2Operation2, class3Operation1
    class1Operation2 | class2Operation3
    class1Operation3 | class2Operation3
    
    Name Operation   | CallsBy
    -----------------+----------------------------------------------------
    class2Operation1 | class1Operation1, class3Operation1,class3Operation3
    class2Operation2 | Entry point of Tabidi
    class2Operation3 | class1Operation1
    
    Name Operation   | CallsBy
    -----------------+---------------------------------------
    class3Operation1 | class1Operation2, class3Operation1
    class3Operation2 | Entry point of Tabada
    class3Operation3 | class2Operation1
    
    以下是用于计算CallsBy(如果不是“入口点”)的子查询:


    我试图编写查询,但没有得到任何结果…

    首先让我说,我认为您的数据库表结构和关系可能不是最优的,仅3个表就显得复杂

    此外,我相信您在本文中列出的数据与您在db fiddle示例中列出的数据之间存在差异。我创建了所有的表,并用您提供的数据填充它们,我提出的查询结果与您上面列出的预期结果不完全匹配

    但是,,我相信这个查询会满足您的需要:如果相应的
    t\u operationtag.Property='CallsBy'
    t\u operationtag.VALUE
    包含
    Entry point
    ,那么它将返回
    t\u operationtag.VALUE
    ,否则它将包含
    t\u操作。给定对象id的Name
    值:

    SELECT top.Name,
        CASE WHEN topt2.VALUE IS NOT NULL THEN topt2.Value
        ELSE GROUP_CONCAT(topt1.VALUE)
        END AS CallsBy
    FROM t_operation AS top
    JOIN t_operationtag AS topt1 ON topt1.ElementID = top.OperationID   
    LEFT JOIN t_operationtag AS topt2 ON topt2.ElementID = top.OperationID
        AND topt2.Property = 'CallsBy'
        AND topt2.VALUE LIKE '%Entry point%'
    JOIN t_object AS obj ON obj.Object_ID = top.Object_ID
    WHERE obj.Object_ID = 1 -- or 2 or 3
    GROUP BY top.Name, topt1.PropertyID, topt2.PropertyID
    ORDER BY top.Name
    

    我希望这会有所帮助。

    示例数据、所需结果和逻辑解释都会有所帮助。尝试使用外部应用程序而不是嵌套的Select:在我看来这似乎很困难,但我会尝试:)感觉示例不必要地复杂