【问题标题】:PHP: keep track of requests by user and by product brand?PHP:按用户和产品品牌跟踪请求?
【发布时间】:2010-10-30 11:35:33
【问题描述】:

我有一个 MySQL 表,其中包含价格请求,它具有日期、第一、最后和 product_id 字段。产品品牌可以从product_id的产品表中找到。

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

例如,假设在给定日期,John Doe 提出了 3 个价格请求,分别是 Burberry 产品和 2 个施华洛世奇产品。人只算 1 个,巴宝莉 1 个,施华洛世奇 1 个。但是如果另一个人请求了 burberry,那么当天就会有 2 个 burberry 和 2 个人。

我希望从那时起。无论如何,最好的方法是什么?我正在使用 PHP4 和 MySQL4

谢谢!

【问题讨论】:

  • 谁添加了这个作为“作业”,这不是作业!这是我正在为我工​​作的公司开展的一个实际项目。
  • 为有问题的表创建语句和一个小样本数据集总是有助于回答这类问题。
  • 查找 COUNT(DISTINCT) 和 GROUP BY。

标签: php mysql php4 mysql4


【解决方案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;

【讨论】:

    【解决方案2】:

    注意:我制作了这张表,因为您没有为您的表提供 SQL DDL。给我一些 cmets,我会编辑答案,直到我们做对为止。

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-23
      • 1970-01-01
      • 2018-03-11
      • 1970-01-01
      • 1970-01-01
      • 2010-10-23
      • 1970-01-01
      相关资源
      最近更新 更多