1

価格要求を含む MySQL テーブルがあり、日付、最初、最後、および product_id フィールドがあります。製品ブランドは、product_id の製品テーブルから見つけることができます。

日付範囲が与えられた場合、彼らは、日付範囲内の各日の人別およびブランド別のリクエストの総数と、日付範囲の合計を知りたいと考えています。ここがトリッキーな部分です。同じ人が 1 日に複数回リクエストを行った場合、1 人としてカウントされます。ただし、1 日に 2 つの異なるブランドをリクエストした場合、各ブランドはその日に 1 つ取得されます。ただし、1 日に複数のブランドをリクエストした場合、そのブランドはその日に 1 つしかカウントされません。

たとえば、特定の日に John Doe が 3 つの価格リクエストを作成したとします。バーバリー製品と 2 つのスワロフスキー製品です。これは、人に 1、バーバリーに 1、スワロフスキーに 1 しかカウントされません。しかし、別の人がバーバリーをリクエストした場合、その日はバーバリーが 2 つ、その日は 2 人になります。

これがうまくいくことを願っています。とにかくこれを行う最良の方法は何ですか?PHP4 と MySQL4 を使用しています

ありがとう!

4

2 に答える 2

1

Machineのテーブル定義を想定して、試してみてください

-- # Shows number of people doing a request per day
SELECT
  Count(DISTINCT userId) AS NumberOfUsers,
FROM
  priceRequestsProducts prp,
  date
GROUP BY
  prp.date;

-- # Shows number of request for a given product per day
SELECT
  Count(DISTINCT userId) AS NumberofUsers,
  productId,
  date
FROM
  priceRequestsProducts prp
GROUP BY
  prp.date, prp.productId;

クエリで使用することは望ましくありません。人々の場合、1日あたり1行を期待し、製品の場合、ペア(製品、日)ごとに1行を期待します。本当にこれを実行したい場合は、productIdとして使用されない値を導入するか(productIdをUNSIGNED INT NOT NULL AUTO_INCREMENTにします)、NULLを使用して、ユーザーを指定します。

SELECT
  Count(DISTINCT userId) AS NumberOfUsers,
FROM
  priceRequestsProducts prp,
  NULL,
  date
GROUP BY
  prp.date;
UNION ALL
SELECT
  Count(DISTINCT userId) AS NumberofUsers,
  productId,
  date
FROM
  priceRequestsProducts prp
GROUP BY
  prp.date, prp.productId;
于 2009-06-09T09:27:42.997 に答える
0

注:テーブルにSQL DDLを指定しなかったため、このテーブルを作成しました。コメントをお願いします。正解になるまで回答を編集します。

CREATE TABLE priceRequestsProducts AS (
    userId INT NOT NULL,
    productId INT NOT NULL,
    date DATE NOT NULL DEFAULT CURRENT_TIMESTAMP,
    INDEX(userId),
    INDEX(productId),
    PRIMARY KEY (userId, productId, date),
    CONSTRAINT fk_prp_users FOREIGN KEY (userId) REFERENCES (Users.id),
    CONSTRAINT fk_prp_products FOREIGN KEY (productId) REFERENCES (Products.id)
) ENGINE=InnoDb;

-- # Shows all dates each user has made a priceRequest for at least one product:
SELECT U.userId, U.firstName, U.lastName, U.username, date
FROM Users U
JOIN priceRequestsProducts as prp ON u.id = prp.id
GROUP BY prp.userId, prp.date;

-- # Shows number of price requests for a product on all dates
SELECT P.id, P.name, count(1) as numRequests, prp.date
FROM Products P
JOIN priceRequestsProducts prp ON prp.productId = P.id
GROUP BY prp.productId, prp.date;
于 2009-06-02T10:15:50.857 に答える