1

以下は疑似クエリなので結果はどうでもいいのですが、以下のMySQLクエリに何か違い(パフォーマンス、結果量など)はありますか?

クエリ 1

SELECT u.`username`, COUNT(*) AS 'posts', u.`age`
FROM `users` u
INNER JOIN `posts` p
ON p.`user_id`=u.`id`
GROUP BY u.`id`
HAVING u.`age` > 12

このクエリの列smthは条件のためにのみ選択されているHAVINGため、その値は結果には必要ないとします。

クエリ 2

SELECT u.`username`, COUNT(*) AS 'posts'
FROM `users` u
INNER JOIN `posts` p
ON p.`user_id`=u.`id` AND u.`age` > 12
GROUP BY u.`id`
4

2 に答える 2

2

HAVING は常に、すべての JOIN および WHERE フィルターが実行された後に実行されます。これは本質的に、クエリの結果に対するフィルターです。これが、クエリの一部ではないフィールドをフィルター処理するために使用できない理由です。

クエリは異なる方法で実行されます。クエリ 2 は、JOIN 中にユーザーを除外するため、より効率的です。クエリ 1 はすべてのユーザーと結合し、そのすべてのデータを取得してグループ化し、年齢でフィルタリングします。クエリ 2 は、12 歳未満のユーザーのみをグループ化してフィルターし、それをグループ化します。クエリ 2 で読み取ってグループ化する必要があるデータは少なくなります。

于 2012-09-24T03:23:24.713 に答える
1

あなたの質問は完全に異なります。特に、2番目は有効な標準SQL構文です。1つ目は、任意の列を集約で許可できるMySQL機能を使用します。

特に、smth最初のクエリの列は、一致するデータの任意の行からのものです。すべての値がすべての行で同じである場合、2つの結果は同等になります。

u.idがユーザーの行ごとに一意であると仮定すると、結果セットは同等になります。ただし、SQLのより読みやすいバージョンは次のようになると思います。

SELECT u.`username`, COUNT(*) AS 'posts', u.`smth`
FROM `users` u  INNER JOIN
     `posts` p 
     ON p.`user_id`=u.`id`
WHERE u.smth is not null
GROUP BY u.`id`, u.username
HAVING u.`smth` IS NOT NULL 

これにより、各行に個別のユーザー名が必要であり、smthをNULLにしたくないことが明確になります。パフォーマンスの点では、このバージョンはすべて2番目のバージョンと同等であり、3つすべてがほぼ同じである必要があります。

于 2012-09-24T03:05:26.023 に答える