[英]SELECT with a variable
我有 3 张桌子:
我尝试为我的每个操作 (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 类的结果将是:
2级
3级
我选择可以使用的类的唯一变量是 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;
以下是他的问题和相关代码的一些注释:
第一个查询或您如何称呼它请求是不行的。 它返回错误,告诉您如果它不在 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.