質問する
101 次
0

このテーブルの選択を作成しようとしていますが、奇妙な結果が得られます。私のテーブル:

tbl_main
–––––––––––––––––-
id  user_id     name

tbl_friends
–––––––––––––––––-
id  user_id     main_id people

tbl_cats
–––––––––––––––––-
id  user_id     main_id

今、私は user_id だけを知っています。これらの項目で結果 (配列) を取得したい:

  • tbl_main からの ID のリストが必要です (結果は、この tbl_main.id DESC でソートする必要があります)
  • tbl_friends.user_id=user_id AND tbl_friends.main_id=tbl_main.id の場合、tbl_friends に何人のユニークな人がいるかを数えます。
  • tbl_friends.user_id=user_id AND tbl_friends.main_id=tbl_main.id の場合、tbl_friends からピープル値のコンマ区切りリスト (または配列) を取得します
  • tbl_cats.main_id = tbl_main.id の場合、tbl_cats.user_id の一意の値をカウントします

これは、1 つのクエリの結果である必要があります。多くの COUNT(DISTINCT) の組み合わせを試していますが、機能せず、完全に失われています。助けてください。どうもありがとう

私はこのようなことを試しました(以下を参照)。結果は問題ないようですが、それを行う方法は正しいですか (1 つのクエリで 3 つの選択)? サーバーの負荷はどうですか?大規模なデータでも問題なく動作しますか?

SELECT e.id
  (SELECT GROUP_CONCAT(DISTINCT ef.people) FROM tbl_friends ef WHERE ef.user_id=$user_id AND ef.main_id=e.id) as result_people, 
  (SELECT COUNT(DISTINCT et.user_id) FROM tbl_cats et WHERE et.main_id=e.id) as total

FROM tbl_main e
WHERE e.user_id = $user_id
ORDER BY e.id DESC
4

1 に答える 1

0

あなたがやろうとしていることを理解しているかどうかはわかりませんが、これは現在のクエリと同じ結果を返し、2 つのスカラー相関サブクエリよりも効率的である必要があります -

SELECT
    tm.id,
    GROUP_CONCAT(DISTINCT tf.people) AS result_people,
    COUNT(DISTINCT tc.user_id) AS total
FROM tbl_main tm
LEFT JOIN tbl_friends tf
    ON tm.id = tf.main_id
    AND tm.user_id = tf.user_id
LEFT JOIN tbl_cats tc
    ON tm.id = tc.main_id
WHERE tm.user_id = $user_id
GROUP BY tm.id DESC

2 つのクエリの EXPLAIN 出力を比較し、それらがどのように機能するかを確認します。

于 2012-04-09T00:42:17.483 に答える