繁体   English   中英

带变量的 SELECT

[英]SELECT with a variable

我有 3 张桌子:

  1. t_object :所有类
  2. t_operation : 与所有操作,链接 t_object.Object_ID = t_operation.Object_ID
  3. t_operationtag : 每个操作的所有标签值,与 t_operation.OperationID = t_operationtag.ElementID 链接

我尝试为我的每个操作 (1) 获取一个列表,其中包含调用操作 (1) 的所有操作 (2):

所以我写了这个请求:

SELECT op1.Name
FROM t_object AS allClass 
LEFT JOIN t_operation AS op1 ON allClass.Object_ID = op1.Object_ID 
INNER JOIN t_operationtag AS function_tag ON ((op1.OperationID = function_tag.ElementID) 
AND (function_tag.VALUE LIKE CONCAT("%", "MSA_Se_SECU_ComputeHMAC", "%") 
AND function_tag.Property = 'Calls'))
GROUP BY op1.OperationID

这里测试查询的示例数据: https : //dbfiddle.uk/?rdbms=mysql_8.0&fiddle=3711bb22e52c4528898ece82833042ce

但我的问题是查询只返回操作“class2Operation1”的“CallsBy”

我想为 select 类的所有操作获取所有 CallsBy。 第 1 类的结果将是:

  • 名称操作 | 来电
  • class1Operation1 | class2Operation2, class3Operation1
  • class1Operation2 | class2Operation3
  • class1Operation3 | class2Operation3

2级

  • 名称操作 | 来电
  • class2Operation1 | class1Operation1, class3Operation1,class3Operation3
  • class2Operation2 | class1Operation1
  • class2Operation3 | class1Operation1

3级

  • 名称操作 | 来电
  • class3Operation1 | class1Operation2, class3Operation1
  • class3Operation2 | class1Operation3
  • class3Operation3 | class2Operation1

我选择可以使用的类的唯一变量是 WHERE myClass.Object_ID = '1'。

此请求运行良好,但我想通过使用变量自动更改“MSA_Se_SECU_ComputeHMAC”。 我试试这个:

SELECT op1.Name
FROM t_object AS allClass2 LEFT JOIN t_operation AS op2 ON allClass2.Object_ID = op2.Object_ID,
t_object AS allClass 
LEFT JOIN t_operation AS op1 ON allClass.Object_ID = op1.Object_ID 
INNER JOIN t_operationtag AS function_tag ON ((op1.OperationID = function_tag.ElementID) AND (function_tag.VALUE LIKE CONCAT("%",op2.Name, "%") AND function_tag.Property = 'Calls'))
WHERE allClass2.Object_ID = '783'
GROUP BY op1.OperationID

但这不起作用,因为他不知道“op2.Name”,我不知道是否可以这样做? 也许有一个变量? 希望它足够清楚。 这里有一些示例数据来测试查询: https : //dbfiddle.uk/?rdbms=mysql_8.0&fiddle=3711bb22e52c4528898ece82833042ce

经过与 OP 的广泛讨论,这是解决方案:

select t2.name "Name Operation"
       , group_concat(t1.name) CallsBy
from t_operation t1
left join (SELECT to3.ElementID
                  , to2.name
           FROM t_object to1
           left join t_operation to2 on to1.Object_ID = to2.Object_ID
           left join t_operationtag to3 on find_in_set(to2.Name, to3.VALUE)
           WHERE to3.Property = 'Calls'
           and to1.Object_ID = '1') t2 ON t1.OperationID = t2.ElementID
where t2.ElementID is not null
group by t2.name;

这是解决方案的DEMO

以下是他的问题和相关代码的一些注释:

第一个查询或您如何称呼它请求是不行的。 它返回错误,告诉您如果它不在 select 语句中(或在 select 语句中的聚合函数中),则您不能按 OperationID 进行分组。

SELECT op1.Name
FROM t_object AS allClass 
LEFT JOIN t_operation AS op1 ON allClass.Object_ID = op1.Object_ID 
INNER JOIN t_operationtag AS function_tag ON ((op1.OperationID = function_tag.ElementID) 
      AND (function_tag.VALUE LIKE CONCAT("%", "MSA_Se_SECU_ComputeHMAC", "%") 
      AND function_tag.Property = 'Calls'))
GROUP BY op1.OperationID

如果在第一个查询中替换此行:

GROUP BY op1.OperationID

用这一行:

GROUP BY op1.Name

代码可以工作,但结果可能不一样......

第二个查询有多个问题。 第一个与第一个查询(分组依据)中的相同。

SELECT op1.Name
FROM t_object AS allClass2 
LEFT JOIN t_operation AS op2 ON allClass2.Object_ID = op2.Object_ID
--, t_object AS allClass 
LEFT JOIN t_operation AS op1 ON allClass.Object_ID = op1.Object_ID 
INNER JOIN t_operationtag AS function_tag ON ((op1.OperationID = function_tag.ElementID) 
      AND (function_tag.VALUE LIKE CONCAT("%",op2.Name, "%") 
      AND function_tag.Property = 'Calls'))
WHERE allClass2.Object_ID = '783'
GROUP BY op1.OperationID

此外,如果您在代码中看到,被注释的行在那里是不合逻辑的。 这不是加入,加入条件,我不知道你想在那里做什么......

此外,在代码的一部分中,您的别名是allClass并且应该是allClass2

如果你改变所有你会得到这个:

SELECT op1.Name
FROM t_object AS allClass2 
LEFT JOIN t_operation AS op2 ON allClass2.Object_ID = op2.Object_ID
LEFT JOIN t_operation AS op1 ON allClass2.Object_ID = op1.Object_ID 
INNER JOIN t_operationtag AS function_tag ON ((op1.OperationID = function_tag.ElementID) 
      AND (function_tag.VALUE LIKE CONCAT("%",op2.Name, "%") 
      AND function_tag.Property = 'Calls'))
WHERE allClass2.Object_ID = '783'
GROUP BY op1.Name

这有效。 但它给出的结果是另一个故事......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM