6

DISTINCT を使用すると機能するクエリがあります。ただし、DISTINCT の使用を避けるのに役立つ方法でクエリを書き直すことができると感じています。これにより、データベースがクエリを処理しやすくなります (より速く)。

クエリを書き直す意味がない場合は、説明してください。ある場合は、単純化されたクエリを見て、そもそも重複しないように再構築する方法のヒントを教えてください。

SELECT Us.user_id, COUNT( DISTINCT Or.order_id ) AS orders
FROM users AS Us
LEFT JOIN events AS Ev ON Ev.user_id = Us.user_id
LEFT JOIN orders AS Or ON Or.event_id = Ev.event_id
OR Or.user_id = Us.user_id
GROUP BY Us.user_id

クエリの簡単な説明: ユーザーのイベントと注文のテーブルがあります。注文には user_id 列がある場合もありますが、ほとんどの場合は null であり、イベント テーブルを介して接続する必要があります。

編集:

これらは私が書いた単純化されたクエリの結果です。

user_id orders
3952    263
3953    7
3954    2
3955    6
3956    1
3957    0
...

user_id orders
3952    79
3953    7
3954    2
3955    6
3956    1
3957    0
...

問題が修正されました:

SELECT COALESCE( Or.user_id, Ev.user_id ) AS user, COUNT( Or.order_id ) AS orders
FROM orders AS Or
LEFT JOIN events AS Ev ON Ev.event_id = Or.event_id
GROUP BY COALESCE( Or.user_id, Ev.user_id )
4

2 に答える 2

1

注文を複数のイベントに関連付けることができる場合、またはユーザーをイベントに複数回関連付けることができる場合、同じ注文を同じユーザーに複数回関連付けることができます。このシナリオでは、 を使用DISTINCTすると、その注文はユーザーごとに 1 回だけカウントされますが、省略した場合は、ユーザーとの関連付けごとにその注文が 1 回カウントされます。

前者の場合は、既存のクエリが最適なオプションです。

于 2012-04-27T10:19:43.370 に答える
1

ユーザー テーブルからもイベント テーブルからも何も得られないので、それらを結合する必要はありません。最後の「OR」句は、 user_ID 列があることを明示的に参照しています。注文テーブルに、注文したユーザー ID のインデックスがあることを願っています。

select
      user_id,
      count(*) as Orders
   from
      orders
   group by
      user_id
于 2012-04-27T11:04:22.903 に答える