2009-06-01 7 views
1

J'ai une table MySQL qui a des demandes de prix, elle contient des champs date, premier, dernier et product_id. La marque du produit peut être trouvée à partir de la table de produits à l'adresse product_id. Étant donné une plage de dates, ils souhaitent connaître le nombre total de demandes, par personne et par marque pour chaque jour de la plage de dates, et le total pour la plage de dates. Voici la partie délicate, si la même personne fait une demande plus d'une fois par jour, alors cela ne compte que pour 1 personnes. Mais si une personne fait une demande pour 2 marques différentes en 1 jour, chaque marque en obtient 1 pour ce jour. mais s'ils font une demande pour des mulitples d'une marque en une seule journée, cette marque n'est comptée que pour ce jour. Par exemple, disons à une date donnée John Doe a fait 3 demandes de prix, pour un produit Burberry et 2 produits swarovski. Cela compterait seulement 1 pour les gens, 1 pour burberry, et 1 pour swarovski. Mais si une autre personne a fait une demande pour burberry alors il y aurait 2 burberry pour ce jour et 2 personnes pour ce jour.PHP: garder une trace des demandes par utilisateur et par marque de produit?

J'espère que cela fait depuis. Quoi qu'il en soit, quelle est la meilleure façon de faire cela? J'utilise PHP4 et MySQL4

Merci!

+0

Qui a ajouté que " devoirs ", ce n'est pas devoirs! C'est un projet sur lequel je travaille pour l'entreprise pour laquelle je travaille. –

+4

Des instructions CREATE pour les tables en question et un petit exemple de jeu de données sont toujours utiles pour répondre à ce genre de questions. –

+1

Recherchez COUNT (DISTINCT) et GROUP BY. –

Répondre

0

Note: J'ai créé cette table, puisque vous n'avez pas fourni votre DDL SQL pour vos tables. Donnez-moi quelques commentaires et je modifierai la réponse jusqu'à ce que nous ayons bien compris.

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; 
1

En supposant que la définition de la table de la machine, essayez

-- # 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; 

Il n'est pas souhaitable d'utiliser sur requête. Pour les gens, vous attendez une ligne par jour, pour les produits que vous attendez une ligne par paire (produit, jour). Si vous voulez vraiment faire cela, d'introduire une valeur non utilisée comme productId (je ferais productId UNSIGNED INT NOT NULL AUTO_INCREMENT) ou utiliser NULL, et l'utiliser pour désigner les utilisateurs:

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; 
Questions connexes