1

このクエリを実行する最良の方法を見つけようとしています。基本的に、システムで 1 回だけ注文した顧客の「ログイン」フィールド (ログイン フィールドは基本的に顧客 ID/キー) のリストを返す必要があります。

私たちのシステムに関するいくつかの背景...

お客様が同じ日に複数回注文した場合は、1 回の注文に相当します。その理由は、複数のベンダーが存在するためです。誰かが注文すると、ショッピング カート システムはその単一の注文を複数の注文に分割します。その注文の一意のベンダーごとに 1 つの注文です。

これが、これまでに思いついた基本的なmysqlクエリです..

SELECT  
xcart_orders.login,
COUNT(xcart_orders.login) as c1,
FROM_UNIXTIME(xcart_orders.date, '%Y-%m-%d') as d1

 FROM
xcart_orders

 WHERE
INSTR(xcart_orders.email, "marketplace") <= 0

 GROUP BY
xcart_orders.login,
FROM_UNIXTIME(xcart_orders.date, '%Y-%m-%d')

ORDER BY
xcart_orders.login
ASC

返されるデータのサンプルを次に示します...

login       c1      d1
01crouse    1   2007-11-30
022336010   2   2009-06-24
022336010   1   2009-08-28
02emzach    1   2011-08-25
02emzach    1   2011-10-18

これにより、顧客の素晴らしいリスト、日付ごとの一意の注文数が返されます

問題は、この結果セットをグループ化し、この結果セットに一意のレコードが 1 つある顧客のみを返す必要があることです。これを行う方法がよくわかりません。

上記のサンプル結果セットが表示された場合、ログインのリストから 01crouse を返す必要があります。そのログインには 1 つのレコード、1 つの注文しかないため、他のレコードには複数の注文があります。ご理解いただけると幸いです。ご不明な点がございましたら、お気軽にお問い合わせください。

使用上の重要な注意事項

私は使用することをお勧めしました:

HAVING c1 = 1

残念ながら、Having は機能しません。その理由は、c1 が 1 よりも大きくなる可能性があるためです。その結果、1 日あたりの注文数が表示されることを覚えておいてください。したがって、誰かが同じ日に 3 つのベンダーに 1 つの注文を出した場合、その 1 日に 3 つの注文が発生しますが、それは 1 つの注文です。配置 - これらのタイプの人々は、HAVING を使用して除外されます

これが、結果セットをグループ化してカウントする必要がある理由です。たとえば、ログイン フィールドで結果セットに対して別のグループを実行し、ログイン時にカウントを実行します。このカウントで 1 を返すレコードは正確です。問題は、この結果セットをグループ化する方法がわからないことです

4

2 に答える 2

1

MySQL の HAVING 句を参照してください。すでにログインでグループ化しているので、簡単に追加できるはずですHAVING COUNT(login) = 1

クエリがより複雑になった場合は、いつでもこのクエリを別のクエリ内にネストして、別のグループ化を行うことができますが、それを行った場合のパフォーマンスの保証はありません。

于 2012-05-29T20:26:59.757 に答える
1

次のように、別の SELECT (元の SELECT の外) でそれを行うことができます。

SELECT login, c1, d1, count(login) as c2 
FROM (...YOUR SELECT...) as orig
GROUP BY login
HAVING c2 = 1

これにより、元の SELECT がログインごとにグループ化され、そこに 1 回だけ表示されるログインのみが表示されるため、1 日だけ買い物をしたユーザーのみが表示されます。

于 2012-05-29T20:33:15.247 に答える