php - 如何将 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 将第一个查询的结果解析到我的事件查询中。
表模式:
解决方案
工程建议 - 规范化数据库
在 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 |
.
推荐阅读
- python - VsCode pycodestyle 安装失败
- javascript - YTDL-CORE 不再工作“找不到播放器配置”
- linux - 如何使用 fetch 将输出添加到 txt 文件,而不是覆盖文件?
- angular - 角度日期选择器验证
- python - 查询 [INFORMATION_SCHEMA].[TABLES] 时,SQLAlchemy 在插入期间挂起
- python - 数据表中的径向热图
- c# - 将 isChecked 绑定添加到自定义 ToggleSwitch
- azure - Centos Docker:对等方重置连接
- c++ - C++ regex_replace 不替换字符串
- python - 我可以从 python 包安装特定的子包,例如 sklearn