Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/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
Php 如何将SQL查询的结果用于另一个查询的WHERE子句?_Php_Sql_Database_Metaprogramming - Fatal编程技术网

Php 如何将SQL查询的结果用于另一个查询的WHERE子句?

Php 如何将SQL查询的结果用于另一个查询的WHERE子句?,php,sql,database,metaprogramming,Php,Sql,Database,Metaprogramming,好的,基本上我有一个包含如下语句的表: incident.client_category = 1 incident.client_category = 8 incident.severity = 1 etc. 我想使用此表中的内容生成满足此表中所表达条件的其他表。所以我需要把它做成 SELECT * FROM incident WHERE incident.client_category = 1 SELECT * FROM incident WHERE (SELECT condition F

好的,基本上我有一个包含如下语句的表:

incident.client_category = 1
incident.client_category = 8
incident.severity = 1
etc.
我想使用此表中的内容生成满足此表中所表达条件的其他表。所以我需要把它做成

SELECT * FROM incident WHERE incident.client_category = 1
SELECT * FROM incident WHERE (SELECT condition FROM condition WHERE id = 1)
但问题的最后一部分必须来自第一张桌子。现在我想做的是

SELECT * FROM incident WHERE incident.client_category = 1
SELECT * FROM incident WHERE (SELECT condition FROM condition WHERE id = 1)
id=1代表条件的id。现在我只想使用一个条件进行测试。有没有办法做到这一点?因为如果没有,我可能需要通过PHP将第一个查询的结果解析到我的事件查询中

表架构:


这里有一种方法可以通过使用所谓的动态sql来实现您的目标,请注意,这只适用于从条件表中选择只返回一条记录

declare @SQLSTRING varchar(4000)
,  @condition VARCHAR(500) -- change the size to whatever condition column size is

SELECT @condition = condition
FROM
    condition
WHERE
    id = 1
 SET @SQLSTRING= 'SELECT  * FROM incident WHERE  ' + @condition
                
exec sp_executesql(@SQLSTRING)
工程建议-规范DB

在MySQL表的字段中存储WHERE子句(如id=10)不是一个好主意。我建议看一看。您不应该将id=10存储为varchar,而是应该存储类似于OtherTableid的内容。这允许您使用索引,优化数据库,并通过使用字段作为WHERE子句获得大量其他功能

但有时我们需要一个解决方案尽快,我们不能重新设计一切!让我们来看看制作一个…… 解决方案

这里有一个解决方案,即使在非常旧的v。MySQL的5.0版本。使用Set设置变量,使用prepare准备语句,并使用execute执行它。让我们将查询设置为一个变量

SET @query = CONCAT(
     "SELECT * FROM incident WHERE ",
     (SELECT condition FROM condition WHERE id = 1)
);
我知道这应该是可行的,因为我的系统不需要构建任何新的表或模式更改,以下内容对我来说绝对有效

SET @query = CONCAT("SELECT id FROM myTable WHERE id = ", (SELECT MAX(id) FROM myTable));
如果我选择@query;,I get:从myTable中选择id,其中id=1737901。现在,我们需要做的就是运行这个查询

PREPARE stmt1 FROM @query; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 
在这里,我们使用a来构建查询,执行查询,并为下一个准备好的语句做好准备。在上面我自己的例子中,任何人都可以在不改变DB模式的情况下对其进行测试,我得到了良好的、积极的结果:执行stmt1;给我

|id | 1737901 |


既然您也用PHP标记了这个问题,我建议您使用它。只需从条件表中选择字符串,并使用结果在PHP中将SQL查询构建为包含它的字符串。然后运行第二个查询。Psudo代码跳过用于调用db的库/框架:

$query = "select condition from condition where id = :id";
$condition = callDbAndReturnString($query, $id);
$query = "select * from incident where " . $condition;
$result = callDb($query);

但是,要非常小心。在条件表中,在何处以及如何填充可能的值?甚至你的用户如何选择使用哪一个呢?如果您允许用户生成值并将其存储在那里,您就有可能遭受二次SQL注入攻击。因为您使用的是条件表中的值作为字符串,所以不能像您希望的那样使用它来参数化查询!通常会。根据您运行的查询和可能的值作为条件,即使您只是让它们从预先构建的列表中进行选择,也可能存在风险。我会认真地问自己,将SQL查询的一部分保存为另一个表中的字符串是否是最好的方法。但是,如果您决定这样做,这应该是可行的。

欢迎使用SO!例如,您希望使用的查询列表的预期结果是什么?我怀疑您可以从条件中选择并将加入事件留在其中,以获得您真正想要的数据,但我不确定。谢谢!因为event.client_category是一个数字,而condition具有上面描述的sql条件:event.client_category=1,所以左连接实际上不起作用。我不确定我是否理解您的问题。埃希瓦纳下面的回答似乎足够了。我刚刚在我自己的数据库上运行了这个程序,效果很好:从myTable中选择id,其中id在select MAXid from myTable;中;。我想也许我们都很困惑,因为我们不确定这些桌子是如何联系在一起的?也许。在这里,我的表是这样的:显然,事件有更多的列,但它们并不重要。我的想法是,我想要得到满足条件表中条件的表。现在,仅仅让其中一个满足条件就足够了,这并不能真正起作用,因为incident.client\u category是一个数字,子查询会抛出类似incident.client\u category的结果=1@EmilioBlancoKobernyk好了,现在清楚了,检查更新的答案您的答案可能会起作用,但我无法让它起作用,因为我不知道如何在Navicat上使用它,而且我的sql命令行使用的是我安装的两台服务器中的一台。它使用的是一个没有保存这个数据库的数据库哈哈:非常感谢!嘿,这正是我要找的!谢谢!嘿,谢谢!令人惊叹的请随意将这个答案标记为正确答案,如果它帮助了你,那么它也可以帮助其他人=成交。我不知道怎么做
哈哈。另外,我希望我能正常化数据库,而不是什么。它确实是颠倒的,但一开始它不是我的:我知道这可能是有害的。我甚至把这件事告诉了我的客户,但他对此没有意见。我有一个想法,如何通过PHP实现它,但不想麻烦它,因为SQL解决方案是我所寻找的。谢谢你的回答!