gpt4 book ai didi

php - WHERE 与生成查询中的 HAVING

转载 作者:行者123 更新时间:2023-11-29 04:09:09 26 4
gpt4 key购买 nike

我知道这个标题被过度使用了,但我的问题似乎还没有得到解答。所以,问题是这样的:

我有一个由四个表(表、行、列、值)组成的表结构,我用它来重新创建 information_schema 的行为(以某种方式)。在 php 中,我正在生成查询来检索数据,结果看起来仍然像一个普通表:

SELECT 
(SELECT value FROM `values` WHERE `col` = "3" and row = rows.id) as "col1",
(SELECT value FROM `values` WHERE `col` = "4" and row = rows.id) as "col2"
FROM rows WHERE `table` = (SELECT id FROM tables WHERE name = 'table1')
HAVING (col2 LIKE "%4%")

SELECT * FROM 
(SELECT
(SELECT value FROM `values` WHERE `col` = "3" and row = rows.id) as "col1",
(SELECT value FROM `values` WHERE `col` = "4" and row = rows.id) as "col2"
FROM rows WHERE `table` = (SELECT id FROM tables WHERE name = 'table1')) d
WHERE col2 LIKE "%4%"

请注意,我定义结果列的部分是由 php 脚本生成的。我为什么要这样做并不重要,但我想扩展这个生成查询的算法以供更广泛的使用。我们到了核心问题,我必须决定是否为查询生成 wherehaving 部分,我知道何时同时使用它们,问题是我的算法没有,我必须为此做一些额外的检查。但是上面的两个查询是等价的,我总是可以将任何查询放在一个子查询中,给它一个别名,并在新的派生表上使用 where。但我想知道我是否会遇到性能问题,或者这是否会以意想不到的方式回到我身边。

我知道它们是如何工作的,以及应该更快的地方,但这就是我来这里问的原因。希望我让自己明白了,请原谅我的英语和冗长无用的短语等等。

编辑 1

我已经知道这两者之间的区别,所有这一切都意味着,我唯一的困境是使用来自其他表的自定义列,具有可变的数字和大小,并试图获得与使用正常创建的表相同的结果意味着我必须使用 HAVING 来过滤派生表列,同时可以选择将其包装在子查询中并在正常情况下使用,这可能会创建一个临时表,之后将被过滤。这会影响大型数据库的性能吗?不幸的是,我现在无法对此进行测试,因为我负担不起用超过 10 亿个条目填充数据库(这将是这样的:rows 表中有 10 亿个, 中有 50 亿个values 表,因为每行有 5 列,cols 表中有 5 行,tables 表中有 1 行 table = 6,000,006 条目总数)

现在我的数据库是这样的:

+----+--------+-----------+------+
| id | name | title | dets |
+----+--------+-----------+------+
| 1 | table1 | Table One | |
+----+--------+-----------+------+

+----+-------+------+
| id | table | name |
+----+-------+------+
| 3 | 1 | col1 |
| 4 | 1 | col2 |
+----+-------+------+
where `table` is a foreign key from table `tables`


+----+-------+-------+
| id | table | extra |
+----+-------+-------+
| 1 | 1 | |
| 2 | 1 | |
+----+-------+-------+
where `table` is a foreign key from table `tables`

+----+-----+-----+----------+
| id | row | col | value |
+----+-----+-----+----------+
| 1 | 1 | 3 | 13 |
| 2 | 1 | 4 | 14 |
| 6 | 2 | 4 | 24 |
| 9 | 2 | 3 | asdfghjk |
+----+-----+-----+----------+
where `row` is a foreign key from table `rows`
where `col` is a foreign key from table `cols`

编辑 2

这些条件只是为了演示目的!

编辑 3

只有两行,两者似乎有区别,使用having的是0,0008,使用where的是0.0014-0.0019。我想知道这是否会影响大量行和列的性能

编辑 4

两次查询的结果是一样的,即:

+----------+------+
| col1 | col2 |
+----------+------+
| 13 | 14 |
| asdfghjk | 24 |
+----------+------+

最佳答案

HAVING是专门针对GROUP BYWHERE是提供条件参数。另见 WHERE vs HAVING

关于php - WHERE 与生成查询中的 HAVING,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17949237/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com