1

このタイトルが乱用されていることは承知していますが、私のような質問にはまだ答えがないようです。したがって、問題は次のようになります。

information_schema の動作を (ある意味で) 再作成するために使用する 4 つのテーブル (テーブル、行、列、値) で構成されるテーブル構造があります。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 スクリプトによって生成されることに注意してください。なぜこれを行うのかはそれほど重要ではありませんが、より幅広い用途のためにクエリを生成するこのアルゴリズムを拡張したいと考えています。そして、コアの問題に到達しました。クエリに対して awhereまたはhavingpart を生成するかどうかを決定する必要があり、両方をいつ使用するかを知っています。問題は、アルゴリズムが生成しないことであり、いくつかの追加チェックを行う必要があります。このため。ただし、上記の 2 つのクエリは同等です。いつでも任意のクエリをサブクエリに入れ、それにエイリアスを付けて、新しい派生テーブルの where を使用できます。でも、パフォーマンスに問題があるかどうか、またはこれが予期せぬ方法で私に戻ってくるかどうかは疑問です.

両方がどのように機能するか、どこがより速いかは知っていますが、これが私がここに尋ねに来た理由です. うまくいけば、私は自分自身を理解してくれました.私の英語と長い無駄な言い回し、そしてすべてを許してください.

編集1

私はすでに2つの違いを知っています。それが意味するすべてのことは、他のテーブルのカスタム列を可変数とサイズで使用し、通常作成されたテーブルを使用するのと同じ結果を達成しようとすると、派生テーブルの列をフィルター処理するための HAVING と同時に、それをサブクエリでラップして通常は where を使用するオプションを使用すると、後でフィルター処理される一時テーブルが作成される可能性があります。これは、大規模なデータベースのパフォーマンスに影響しますか? 残念ながら、データベースに 10 億を超えるエントリを入力する余裕がないため、現時点でこれをテストすることはできません (つまり、テーブルに 10 億、rowsテーブルに50 億values、すべての行に 5 列、5 行があるためです)。cols表と1行でtablesテーブル =合計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

2行だけですが、havingを使ったものは0.0008、whereを使ったものは0.0014-0.0019という違いがあるようです。これが多数の行と列のパフォーマンスに影響するのだろうか

編集4

2 つのクエリの結果は同じです。つまり、次のようになります。

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

4 に答える 4

4

HAVINGは特に、GROUP BY条件WHERE付きパラメーターを提供するためのものです。WHERE と HAVINGも参照してください

于 2013-07-30T14:10:24.340 に答える
1

この場合、値を読み取って一致を探すのではなく、特定の値を定義しているため、having 句の方が高速になると思います。

于 2013-07-30T14:08:00.483 に答える
1

参照: http://database-programmer.blogspot.com/2008/04/group-by-having-sum-avg-and-count.html

基本的にWHERE、集計関数に渡す前に列をフィルター処理しますがHAVING、集計関数の結果をフィルター処理します。

于 2013-07-30T14:11:57.037 に答える
0

あなたはそのようにすることができます

    WHERE col2 In (14,24)

あなたのコードWHERE col2 LIKE "%4%"は悪い考えなので、col2 = 34 も選択されます。

于 2013-07-30T14:17:22.707 に答える