4

私のクエリの一部は次のようになります。

HAVING date > '2011-04-13 04:28:03'

日付変数にインデックスが付けられていますが、これはクエリに影響しますか?

EXPLAIN EXTENDED はインデックスを使用していないようですが、テストしているデータベースに 4 つの行があるためかどうかはわかりません。

私のクエリ:

SELECT AVG(slen) FROM
(
SELECT date, COUNT(id) as slen
FROM table
WHERE product_id = 2830
GROUP BY id
HAVING date > '2011-04-13 04:28:02'
) as T

異なる日付値を持つ行がいくつかあります。日付が「2011-04-13 04:28:02」を超える ID のグループを選択したい。次に、日付条件なしで、グループに属する行の平均数が必要です。

ちなみに、クエリはそのままではまだ機能しません。

私の他の懸念は、日付 > '2011-04-13 04:28:02' が私の日付列インデックスを使用するかどうかでした。

このデータセットから:

sid             datelast                product_id
782240551706    2011-04-13 00:51:52     2830
782240551706    2011-04-13 04:05:48     2830
782240551706    2011-04-13 04:28:03     2830
111111111111    2011-04-13 00:50:30     2830

望ましい結果:

ID 782240551706 のグループを選択する必要があり、平均は 3 である必要があります。

次のクエリは、目的の結果を生成します。

SELECT AVG(slen) FROM
(
SELECT date, COUNT(id) as slen
FROM table
WHERE product_id = 2830
GROUP BY id
HAVING **max(date)** > '2011-04-13 04:28:02'
) as T
4

3 に答える 3

1

HAVING は GROUP BY と組み合わせて使用​​されるため、派生テーブルです。使用するインデックスがどのようになるかわかりません。

于 2011-04-14T02:29:23.237 に答える
1

例えば:

SELECT 
    column1, 
    count(column2) as count 
FROM table 
GROUP BY column1 
HAVING count > 1

カウントはクエリによって計算されます。あなたの場合、インデックスが作成されていません。having 句を where 句に変更できます。

于 2011-04-14T03:10:48.027 に答える
-1

列「日付」は GROUP BY に含まれていますが、集計でも GROUP BY 句でもないため、そのクエリは意味がありません。

通常の SQL データベースはそれを拒否します。厳密モードの場合、mysql はそれを拒否します。

この場合、動作は基本的に未定義です。やらないでください。

HAVING ではなく、WHERE で行をフィルター処理する必要があると確信しています。また、列リストで日付を指定したくない場合は、代わりに min(date) または max(date) を試してください。

いいえ、HAVING が一致するグループを見つけるために GROUP BY を実行する必要があるため、HAVING はインデックスを使用しません。通常は WHERE を使用する方が適切であり、集約に対してのみ HAVING を使用します (例: HAVING COUNT(*) > 1)。

于 2011-04-14T05:56:39.147 に答える