2009-06-01 6 views
1

Ich habe eine MySQL-Tabelle, die Preisanfragen enthält, es hat date, first, last und product_id Felder. Die Produktmarke finden Sie in der Produkttabelle der product_id.PHP: Anfragen von Benutzern und Produktmarken nachverfolgen?

In einem Datumsbereich möchten sie die Gesamtzahl der Anfragen nach Personen und nach Marke für jeden Tag im Datumsbereich und die Gesamtzahl der Datumsbereiche ermitteln. Hier ist der schwierige Teil, wenn dieselbe Person mehr als einmal pro Tag eine Anfrage stellt, dann zählt sie nur als 1 für Leute. Aber wenn eine Person an einem Tag zwei verschiedene Marken anfragt, erhält jede Marke für diesen Tag 1. aber wenn sie an einem einzelnen Tag mehrere Markenanfragen stellen, wird diese Marke nur für diesen Tag gezählt.

Zum Beispiel lässt sagen, dass zu einem bestimmten Datum John Doe 3 Preisanfragen, für ein Burberry-Produkt und 2 Swarovski-Produkte. Das würde nur 1 für Leute zählen, 1 für Burberry und 1 für Swarovski. Aber wenn eine andere Person einen Antrag für Burberry dann würde es 2 Burberry für diesen Tag und 2 Personen für diesen Tag.

Ich hoffe, dass dies seit. Wie auch immer, was ist der beste Weg dies zu tun? Ich benutze PHP4 und MySQL4

Danke!

+0

Wer dies jemals hinzugefügt als " Hausaufgaben ", das sind keine Hausaufgaben! Dies ist ein aktuelles Projekt, an dem ich für das Unternehmen arbeite, für das ich arbeite. –

+4

CREATE-Anweisungen für die fraglichen Tabellen und ein kleiner Beispieldatensatz sind immer hilfreich, um diese Art von Fragen zu beantworten. –

+1

Nachschlagen COUNT (DISTINCT) und GROUP BY. –

Antwort

0

Hinweis: Ich habe diese Tabelle erstellt, da Sie Ihre SQL DDL für Ihre Tabellen nicht angegeben haben. Gib mir nur ein paar Kommentare und ich werde die Antwort bearbeiten, bis wir es richtig verstanden haben.

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

die Tabellendefinition der Maschine, versuchen Es ist nicht wünschenswert, die Verwendung auf Abfrage

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

Unter der Annahme. Für Menschen würden Sie eine Zeile pro Tag erwarten, für Produkte würden Sie eine Zeile pro Paar erwarten (Produkt, Tag). Wenn Sie das wirklich tun wollen, stellen einen Wert nicht als productId verwendet wird (würde ich productId UNSIGNED INT NOT NULL AUTO_INCREMENT machen) oder NULL verwenden, und verwenden Sie es Benutzern bezeichnen:

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; 
Verwandte Themen