0

これが私のクエリです:

SELECT v2.mac, v2.userag_hash, v2.area, count(*), count(distinct v2.video_id) 
FROM video v2 JOIN (
  SELECT distinct v.mac, v.userag_hash 
  from video v 
  WHERE v.date_pl >= '2012-01-30 00:00' AND 
    v.date_pl <= '2012-02-05 23:55' 
  ORDER BY rand() LIMIT 50
) table2 
ON v2.mac = table2.mac AND 
  v2.userag_hash = table2.userag_hash AND 
  v2.date_pl >= '2012-01-30 00:00' AND 
  v2.date_pl <= '2012-02-05 23:55' 
GROUP BY v2.mac, v2.userag_hash

データベースに 1 つのテーブル「ビデオ」があり、数千のユーザーのデータが含まれています。50 人のユーザーをランダムに選択し、選択した行に基づいて計算したいと考えています (各ユーザーは の一意の組み合わせによって識別されます)。このクエリの結果は次のとおりです。 :

 usermac1, userag_hash1, area1, 10, 5
 usermac2, userag_hash2, area2, 20, 8
  ...

しかし、クエリの最後に「GROUP BY」を使用しないと、usermac、userag_hash、areax、1500、700 の 1 つの行のみが返されます (この行が何を表しているのかわかりません)。

「1500, 700」が前の結果の最後の 2 列の合計かどうか疑問に思っています。1500 = 10+20+... 700 = 5+8+... のように

4

1 に答える 1

1

集計関数 (カウント) が 1 つしかなく、2 つの列で使用され、GROUP BY をまったく使用せずに実行できるという事実に基づいて、非標準準拠の MySQL を使用している必要があります。

SELECT v2.mac, v2.userag_hash, v2.area, count(*), count(distinct v2.video_id) 
...

データが何であれ、集計関数を使用すると、MySQL は 1 つの行を返します。

<undefined value>, <undefined value>, count of all rows, count of rows where v2.video_id is distinct (and probably non null).

したがって、1500 行、v2.video_id の 700 の個別の値、または 700 の非 null の個別の値があると思います。この空想をテストするには、次のことを試してください。

count(distinct IFNULL(v2.video_id,'nullvaluehere'))

null を非 null に変換して、それらが含まれるようにします。

「未定義の値」は、最初の行、最後の行、null 以外の最初の行、インデックスの最初の行、キャッシュの最初の行などである可能性があります。無効なクエリを記述したときに何が起こるかについての定義はありません。

私が認識している MySQL 以外のすべての SQL データベースでは、エラー メッセージが表示され、クエリを実行することさえできません。クエリが有効であるためには、集計されていないすべての列が group by に含まれている必要があります。例えば。mac と userag_hash は両方とも group by に含まれている必要があります。

于 2012-04-12T12:24:23.323 に答える