Mysql 如何将SELECT CASE与子查询一起使用
我的SELECT查询有问题。我尝试检索标记值名称“CallsBy”,但仅当该值为“入口点”时,否则我希望通过另一个子查询计算调用 我有三张桌子: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
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:在我看来这似乎很困难,但我会尝试:)感觉示例不必要地复杂