0

次のクエリを検討してください。

SELECT artist.id, COUNT(DISTINCT artist$styles.v_id)
FROM artist
LEFT JOIN artist$styles ON artist$styles.p_id = artist.id

これは私が得る結果です:

id  count
1   4

質問は次のとおりです。

  1. テーブルに4つの行があり、クエリに適用される、、、または句がない場合に、artistテーブルから1つの行だけを選択するのはなぜですか?WHEREHAVINGLIMITGROUP BY
  2. 価値のあるレコードは3つしかないのにartist$styles、なぜカウントされるのですか?p_id14
  3. GROUP BY句を追加すると正しい結果が得られるのはなぜですか?

    SELECT artist.id, COUNT(DISTINCT artist$styles.v_id)
    FROM artist
    LEFT JOIN artist$styles ON artist$styles.p_id = artist.id
    GROUP BY artist.id
    ----
    id  count
    1   3
    2   1
    3   3
    4   1
    
  4. これはすべて私には意味がありません。これはMySQLのバグでしょうか?Community5.5.25aを実行しています

4

3 に答える 3

3
  1. 集約関数(そのうちの1つ)のマニュアルページに記載されているようにCOUNT()

    GROUP BY句を含まないステートメントでグループ関数を使用する場合、それはすべての行でグループ化することと同じです。

  2. 非表示の列があるのマニュアルページにGROUP BY記載されているように:

    サーバーは各グループから任意の値を自由に選択できるため、同じでない限り、選択される値は不確定です。

    つまり、サーバーは列p_idに1つの(不確定な)値を選択しました。この場合は値1になりますが、関数の結果は適切に集計およびカウントされCOUNT()ます。

  3. これは、すべての行ではなく、正しい列でグループ化するためです。

  4. バグではありません。この動作は文書化されており、設計によるものです。

于 2012-07-23T09:42:25.813 に答える
0

Mysqlのバグの可能性があります。誇張されていないすべての列は、Groupby句に含める必要があります。MySQLはこれを強制せず、結果は予測不可能でデバッグが困難です。原則として、Groupby句には常にすべての非集計列を含めます。これがすべてのRDBMSの仕組みです

于 2012-07-23T09:35:30.333 に答える
0
  1. カウント関数は、group by句を使用していない場合に単一行の結果を返します。そのため、1行が返されます。

2.出力で

id  count
1   4

4は、ID 1の結果ではなく、そのテーブルの結果の総数です。1つの行のみが生成されるため、1の前に表示されます。

3. group byを使用すると、その列値のグループが作成されるため、その出力が得られます。

そして最後に、それはバグではありません。Mysqlは、mysqlサイトで読むことができる適切なドキュメントを提供します。

于 2012-07-23T09:50:00.380 に答える