0

こんにちは、次のクエリがあります。

SELECT PAS_User.user_user_id, 
PAS_User.user_city, 
PAS_User.user_company, 
PAS_User.user_country, 
PAS_User.user_account_type, 
PAS_User.user_account_premium, 
PAS_User.user_sign_up_date, 
PAS_User.user_first_name, 
PAS_User.user_last_name, 
PAS_User.user_avatar_url, 
PAS_User.user_cover_image_url, 
PAS_User.user_bio, 
PAS_User.user_sector, 
PAS_User.user_job_type, 
(SELECT COUNT(*) FROM `PAS_Follow` WHERE `folw_follower_user_id`=:sid) AS user_following_count,
(SELECT COUNT(*) FROM `PAS_Follow` WHERE `folw_followed_user_id`=:sid) AS user_followed_count,
(SELECT COUNT(*) FROM `PAS_Post` WHERE `post_user_id`=:sid) AS user_post_count, 
(SELECT COUNT(*) FROM `PAS_Follow` WHERE `folw_follower_user_id`=:sid AND `folw_followed_user_id`=:cid) AS user_this_user_is_following, 
(SELECT COUNT(*) FROM `PAS_Follow` WHERE `folw_followed_user_id`=:cid AND `folw_follower_user_id`=:sid) AS user_this_user_is_followed 
FROM PAS_User 
WHERE `PAS_User`.`user_user_id`=:sid

これは、プロファイル ページと、:sid = 1 および :cid = 2 である基本的なユーザーの詳細について、他のテーブルからカウントを取得するように設計されています。

問題は、おそらくより小さなクエリまたはよりクリーンな方法でこれを達成するためのより良い方法はありますか?

使用するテーブルは

PAS_User、PAS_Follow、PAS_Post

ありがとう

ジャスティン

4

2 に答える 2

0

正直に言います。selectネストされたステートメント (select内)はあまり好きではありませんselect。ただし、あなたの場合、代替手段は醜く、パフォーマンスエラーが発生しやすい可能性があります。誘惑は次のようなことをすることです:

select . . .
from PAS_User u left outer join
     (select folw_foller_user_id, count(*) as user_following_count
      from PAS_Follow pf
      group by folw_foller_user_id
     ) pf
     on pf.folw_foller_user_id = u.user_user_id left outer join
     . . .

罰金。しかし、これは元のクエリよりもパフォーマンスが大幅に低下しますuser_user_id。これを修正するには、サブクエリで条件を繰り返します。

select . . .
from PAS_User u left outer join
     (select folw_foller_user_id, count(*) as user_following_count
      from PAS_Follow pf
      where folw_foller_user_id = :sid
      group by folw_foller_user_id
     ) pf
     on pf.folw_foller_user_id = u.user_user_id left outer join
     . . .

あるいは:

select . . .
from PAS_User u cross join
     (select count(*) as user_following_count
      from PAS_Follow pf
      where folw_foller_user_id = :sid
     ) pf
     on pf.folw_foller_user_id = u.user_user_id left outer join
     . . .

そして、 1 つのサブクエリで条件を繰り返すのが良いとさえ主張するかもしれません。5 つのサブクエリに対してその議論を行うことはできません。

これを明確にするための最適な構文は、ウィンドウ関数を使用することです。

select . . .
       count(*) over (partition by folw_fllower_user_id) as user_following_count,
       . . .

残念ながら、MySQL はウィンドウ関数をサポートしていません。私の意見では、非常に合理的な代替手段はサブクエリです (通常は相互に関連付けられます)。これにより、初期構文がサポートされます。

于 2013-06-03T14:31:42.763 に答える