PHP: отслеживать запросы пользователей и марки продукта? - PullRequest
1 голос
/ 01 июня 2009

У меня есть таблица MySQL с запросами цен, полями date, first, last и product_id. Марку продукта можно найти в таблице продуктов из product_id.

Учитывая диапазон дат, они хотят знать общее количество запросов по людям и марке за каждый день в диапазоне дат и общее количество по диапазону дат. Здесь есть сложная часть: если один и тот же человек делает запрос более одного раза в день, то он считается только 1 для людей. Но если человек делает запрос на 2 разных бренда за 1 день, каждый бренд получает 1 за этот день. но если они делают запросы на несколько брендов в течение одного дня, то этот бренд получает только 1 за этот день.

Например, допустим, в определенную дату Джон Доу сделал 3 запроса цен на продукт Burberry и 2 продукта swarovski. Это будет только 1 для людей, 1 для Burberry и 1 для Swarovski. Но если бы другой человек сделал запрос на Burberry, то было бы 2 Burberry на этот день и 2 человека на этот день.

Я надеюсь, что это делает с тех пор. В любом случае, каков наилучший способ сделать это? Я использую PHP4 и MySQL4

Спасибо!

Ответы [ 2 ]

1 голос
/ 09 июня 2009

Предполагая определение таблицы 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;
0 голосов
/ 02 июня 2009

Примечание. Я создал эту таблицу, поскольку вы не указали свой 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;
...