首页 > 解决方案 > 如何将 SQL 查询的结果用于另一个查询的 WHERE 子句?

问题描述

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

incident.client_category = 1
incident.client_category = 8
incident.severity = 1
etc.

我想使用该表中的内容来生成满足该表中表达的条件的其他表。所以我需要让它像

SELECT * FROM incident WHERE incident.client_category = 1

但是 where 的最后一部分必须来自第一个表。现在我想做的是像

SELECT * FROM incident WHERE (SELECT condition FROM condition WHERE id = 1)

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

表模式:

在此处输入图像描述

在此处输入图像描述

标签: phpsqldatabasemetaprogramming

解决方案


工程建议 - 规范化数据库

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

但有时我们需要尽快找到解决方案,但我们无法重新设计一切!那么让我们来看看制作一个......

解决方案

这是一个即使在非常旧的 v. 5.0 版本的 MySQL 上也可以工作的解决方案。使用 设置变量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));

如果我SELECT @query;,我得到:SELECT id FROM myTable WHERE id = 1737901。现在,我们需要做的就是运行这个查询!

PREPARE stmt1 FROM @query; 
EXECUTE stmt1; 
DEALLOCATE PREPARE stmt1; 

在这里,我们使用 aprepare来构建查询,execute执行它,并deallocate为下一个准备好的语句做好准备。在上面我自己的示例中,任何人都可以在没有更改数据库架构的情况下对其进行测试,我得到了很好的积极结果:EXECUTE stmt1;给了我...

| id | 1737901 | .


推荐阅读