我有一个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
谢谢!
答案 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;