我知道这个标题被过度使用了,但是似乎我的问题还没有回答。因此,问题是这样的:
我有一个由四个表(表,行,列,值)组成的表结构,用于重新创建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脚本生成的。我这样做的重要性不那么重要,但是我想扩展该算法,以生成更广泛的用途的查询。我们已经解决了核心问题,我必须决定是否要为查询生成一个where或having一部分,而且我知道何时同时使用它们,问题是我的算法没有,而且我必须做一些额外的检查为了这。但是以上两个查询是等效的,我总是可以将任何查询放在子查询中,给它一个别名,然后在新的派生表上使用where。但是我不知道我的性能是否会出现问题,或者这是否会以一种意想不到的方式再次出现在我身上。
where
having
我知道它们都是如何工作的,应该在哪里更快,但这就是为什么我来这里询问。希望我能使自己理解,请原谅我的英语和冗长无用的词组等等。
编辑1
我已经知道两者之间的区别,这意味着我唯一的难题是使用其他表中具有可变数字和大小的自定义列,并尝试获得与使用正常创建的表相同的结果,这意味着我必须使用可以过滤派生表的列,同时可以选择将其包装在子查询中并在正常情况下使用,这可能会创建一个临时表,此后将对其进行过滤。这会影响大型数据库的性能吗?不幸的是,我现在无法对此进行测试,因为我无法负担超过10亿个条目来填充数据库(这将是这样的:rows表中有10亿个values表,表中有50亿个表,因为每一行有5列,5行在cols表格和1行中tables表=总共 6,000,006 个条目)
rows
values
cols
1
tables
现在我的数据库看起来像这样:
+----+--------+-----------+------+ | 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专为GROUPBY,WHERE是提供条件参数。
HAVING
GROUPBY
WHERE