PHP:跟踪用户和产品品牌的请求?

时间:2009-06-01 18:30:24

标签: php mysql php4 mysql4

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

考虑到日期范围,他们希望了解日期范围内每天的人员和品牌请求总数,以及日期范围的总数。这是一个棘手的部分,如果同一个人在一天内多次提出请求,那么对于人来说它只计为1。但如果一个人在1天内提出2个不同品牌的请求,那么每个品牌当天就会获得1个。但如果他们在一天内提出品牌的多重要求,那么该品牌当天只计算1个。

例如,假设在给定的日期,John Doe为Burberry产品和2个施华洛世奇产品提出了3个价格请求。对于人来说,这只算1,对burberry则为1,施华洛世奇为1。但如果另一个人要求burberry,那么当天会有2个burberry,那天会有2个人。

我希望这是因为。无论如何,最好的方法是什么?我使用的是PHP4和MySQL4

谢谢!

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;