-3

3つのテーブル

accounts, products, users
  1. アカウントにIDがあるユーザーテーブルからユーザーIDとメールアドレスを選択します
  2. 次に、ユーザーが3つ以上の製品を購入した製品テーブルからそれらを除外します(製品テーブルでユーザーをカウントし、カウントが3を超える場合はユーザーを除外する必要があります)。

       SELECT id, email
    FROM  users 
    WHERE id
    IN (
    SELECT user_id
    FROM accounts
    WHERE users.id = user_id
    )
    

すべてのユーザーIDと電子メールを取得しましたが、製品テーブルからそれらを除外する必要があります。製品テーブルには、「product_id」と「leader_id」(ユーザーID)があります。

テーブルが非常に大きいため、最適化されたクエリが必要です

4

2 に答える 2

1

最適化されたクエリが必要な場合は、スキーマの適切な詳細 (テーブル、データ型、およびインデックス) を提供してください。

   SELECT id, email
   FROM  users 
   WHERE id
   IN (
      SELECT user_id
      FROM accounts
      WHERE users.id = user_id
   )

どうしても必要な場合を除き、サブクエリは使用しないでください。アカウント テーブルにデータが必要ないため、'EXISTS (SELECT 1 FROM accounts WHERE users.id=user_id)' はほとんどの DBMS ではるかに効率的ですが、最適化されない MySQL では効率的ではありません。述語を適切にプッシュします。

クエリは次のとおりです。

SELECT DISTINCT u.id, u.email
FROM users u INNER JOIN accounts a 
ON u.id=a.user_id;

ユーザーが 3 つ以上の製品を購入した製品テーブルから除外

前のクエリを書き直すのに十分なスキーマを推測できますが、製品テーブルがどのように構造化されているかわかりません。実際、「製品」はアイテムのカタログを意味し、アカウントとの関係は n:m のようですこれは、関係を分解するテーブルが欠落している必要があることを意味します。さらに、あなたの説明から、アカウントデータは「製品」テーブルデータとは無関係です(これは非常に奇妙に思えます)。ユーザーが「製品」に関連レコードを持たないケースを含めますか?

これが当てはまらないと仮定して、構造が何であるかを推測すると....

SELECT u.id, u.email, SUM(IF(leader_id IS NULL, 0, amount))
FROM users u INNER JOIN accounts a 
ON u.id=a.user_id
LEFT JOIN product p
ON u.id=p.leader_id
GROUP BY u.id, u.email;

テーブルが非常に大きいため、最適化されたクエリが必要です

1 回のクエリですべてのデータを確認する必要があるのはなぜですか?

于 2013-03-13T12:59:45.107 に答える
1

私は少し理解しています...次のようなものが機能するはずです:

 select u.id,u.mail,
 (select count(1) 
   from products
  where products.leader_id = u.id)
 as conteo
 from user u
  left join account ac
 on(u.id = ac.user_id)
 having (conteo>3)

役に立てば幸いです;)

サルドス。

于 2013-03-13T12:48:48.433 に答える