1

我有一个 MySQL 表,其中包含价格请求,它有 date、first、last 和 product_id 字段。产品品牌可以从 product_id 的产品表中找到。

给定一个日期范围,他们想知道该日期范围内每一天的用户和品牌请求总数,以及该日期范围的总数。这是棘手的部分,如果同一个人在一天内多次提出请求,那么它只计为 1 人。但是,如果一个人在 1 天内请求 2 个不同的品牌,则每个品牌当天都会获得 1 个。但是,如果他们在一天内请求多个品牌,则该品牌当天仅计为 1。

例如,假设在给定日期,John Doe 提出了 3 个价格请求,分别是 Burberry 产品和 2 个施华洛世奇产品。人只算 1 个,巴宝莉 1 个,施华洛世奇 1 个。但是,如果另一个人提出了对 burberry 的请求,那么当天将有 2 个 burberry,当天有 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;

不希望在查询中使用。对于人,您会期望每天一行,对于产品,您会期望每对一行(产品,天)。如果您真的想这样做,请引入一个不用作 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 回答