2016-11-15 8 views
0

各ユーザーに固有の日付/時刻の前に、すべてのユーザーからすべてのデータを返そうとしています。MySQL複数行サブクエリの修正

各ユーザーの正確な日付に関するすべてのデータを返すことができますが問題はありませんが、キー日付以下の日付を返すようにクエリを拡張する方法はわかりません。

私は2テーブルのSQLデータベースを持っています。

表1-「sales」には、すべてのトランザクションの確認レコードがあります。

  • USER_ID(日付、その後、様々な購入情報)

表2 - "user_dataの" すべての閲覧データ

  • のuser_id、record_date、purchase_made(purchase_madeがmisnamedさの記録を持っています購入ポップアップをトリガーしたが、実際に購入していない可能性があります。そのあと、ユーザーアクションデータがたくさんあります)

最初の購入前と購入前に、購入したユーザーのすべてのuser_dataレコードを取得する必要があります。私は次のように使用することができ、正確な購入記録を得るために

SELECT * 
FROM user_data 
WHERE user_id IN (SELECT user_id FROM sales) 
AND record_date IN (SELECT min(record_date) FROM user_data WHERE purchase_made = 1 GROUP BY user_id); 

今、私が本当にしたいすべてが「< =」私は「缶に、第2「IN」を変更することができることです1行以上を返すサブクエリでそれを行います。

免責事項 - 私は、データベースを書いていない、私は、データベースを変更する権限がありません(でも、私はそうする権利の人だろう)

免責事項2 - 私はpurchase_madeを使用していることを知っていますこれらのすべてが買物になるわけではないので、結果を少し汚すでしょう。しかし、レポートのために、sales_madeに関連付けられたタイムスタンプ(実際のデータセットで実行される大規模なクエリ比較によって証明されたもの)を使用するよりも、実際には信頼性が低いほど十分な時間をSalesテーブルから取得できます。しかし、上からの命令は重要ではない、彼らは "ほとんど"正確に満足しているでしょう。

答えて

0

はIN 『「だから、の必要性を排除したレコードを相関させることにより、それ相関サブクエリ作る

』と< =「に 『IN』今、私が本当にしたいすべてのは、その二を変更できるようにすることです」今あなたが日付を比較user_IDはにして、参加基準に基づいに参加するインライン・ビュー作りサブクエリにし、代わりにサブクエリのUSER_IDを追加することです<=

SELECT * 
FROM user_data UD 
WHERE user_id IN (SELECT user_id FROM sales) 
    AND record_date <= (SELECT MIN(record_date) 
         FROM user_data UD2 
         WHERE UD2.purchase_made = 1 
         AND UD2.User_ID = UD.User_ID); 

別のアプローチを使用することができます。

私は、where句に...

WHERE 
    user_ID EXISTS (SELECT NULL FROM sales S WHERE S.user_ID = UD.user_ID) 

私はますます大きく得るために売上表があると思われ、INが存在する場所として、時間の経過とともにパフォーマンスに低下しますが、早期に結果サブクエリを存在することができます変更することを検討します

改善された性能。

+0

私はちょうど何が起こったのか分かりません。しかし、私はそれが大好きだと思います。私は完璧に働いていると確信しています。私は研究するためにいくつかのことを教えてくれました。ありがとうQ! – Dulock

+0

@Dulockは分かりません。これがあなたが維持しなければならないものなら、あるいは開発作業をしているなら、このタイプの概念の知識があなたを助けます! – xQbert

関連する問題