Newsgroup: it.comp.www.php
Titolo: e-commerce: relazionare articoli<-->acquisti utente

Salve a tutti,
un mio cliente mi ha chiesto di implementare il proprio e-commerce (PHP-mySQL) con una relazione tra gli
articoli acquistati dai vari utenti in modo da consigliare altri prodotti agli stessi.
Mi spiego meglio: in qualche e-commerce, nella pagina dell'articolo si consigliano altri articoli acquistati
da utenti che hanno acquistato l'articolo in questione. Praticamente dovrei fare questo.
Ora, si pensava di inserire una tabella-clone dei prodotti contenente esclusivamente gli ID del prodotto ed
un'altro campo in cui inserire man mano gli ID dei prodotti acquistati in relazione allo stesso. Ma che vien
fuori? migliaia di ID scritti per ogni ID e poi rielabora e calcola etc.
Altra soluzione sarebbe quella di creare una tabella per ogni prodotto, una riga per ogni ID con campo
ID(prodotto da relazionare) e acquistato(auto_incr). Qui invece, migliaia di tabelle.. e quando si elimina il
prodotto, eliminare la riga contenente l'ID del prodotto da tutte le tabelle.
Quale potrebbe essere la migliore soluzione? Io propenderei più per la seconda ma sto ben attento a seguire la
mia mente contorta :)
Consigli ben accetti
Grazie
-- 
Sousa - 
http://laBoratorio.sousa.it
 - just.sousa{at}katamail{dot}com

fuori? migliaia di ID scritti per ogni ID e poi rielabora e calcola etc.
Se hai gia' uno storico cliente, basta una query. Altrimenti crei uno
storico cliente del tipo (ID_Cliente, ID_Prodotto, Data_Acquisto). Ti
ritrovi un record (abbastanza piccolo) per ogni prodotto acquistato.
Quando hai un prodotto ID_1, fai qualcosa come
	SELECT A.ID_Prodotto, COUNT(A.ID_Prodotto) AS c FROM storico as A
JOIN storico AS B ON (A.ID_Cliente = B.ID_cliente) AND A.ID_prodotto !=
ID_1 AND B.ID_prodotto = ID_1 GROUP BY A.ID_Prodotto ORDER BY c DESC;
CREATE TABLE storico (ID_Cliente integer, ID_Prodotto integer);
# Il cliente N compra i prodotti divisibili per N
INSERT INTO storico VALUES (2, 2), (2, 4), (2, 6), (2, 8), (2,10), (2,12);
INSERT INTO storico VALUES (3, 3), (3, 6), (3, 9), (3, 12), (3,15);
INSERT INTO storico VALUES (4, 4), (4, 8), (4, 12), (4, 16);
INSERT INTO storico VALUES (5, 5), (5, 10), (5, 15);
INSERT INTO storico VALUES (6, 6), (6, 12);
Adesso vuoi sapere lo stato del prodotto 12:
SELECT A.ID_Prodotto, COUNT(A.ID_Prodotto) AS c FROM storico as A JOIN
storico AS B ON (A.ID_cliente = B.ID_cliente) AND A.ID_prodotto != 12 AND
B.ID_prodotto = 12 GROUP BY A.ID_Prodotto ORDER BY c DESC LIMIT 2;
+-------------+---+
| ID_Prodotto | c |
+-------------+---+
|           6 | 3 |
|           4 | 2 |
+-------------+---+
Chi ha comprato il prodotto 12 ha comprato anche il prodotto 6 e il 4.
Il costo minimo (butti via il primo record) dovrebbe essere per una JOIN
di questo tipo:
SELECT A.ID_Prodotto, COUNT(A.ID_Prodotto) AS c FROM storico as A JOIN
storico AS B ON (A.ID_cliente = B.ID_cliente AND B.ID_prodotto = 12) GROUP
BY A.ID_Prodotto ORDER BY c DESC LIMIT 2;
Eventualmente puoi creare ogni tanto una tabella "cache" per le coppie
piu' significative:
DROP TABLE IF EXIST best_cache; /* Non sono sicuro della sintassi */
CREATE TABLE best_cache (prod1 integer, prod2 integer, conto integer);
INSERT INTO best_cache SELECT A.ID_Prodotto, B.ID_prodotto, COUNT(*) AS c
FROM storico as A JOIN storico AS B ON (A.ID_cliente = B.ID_cliente) WHERE
A.ID_Prodotto < B.ID_Prodotto GROUP
BY A.ID_Prodotto, B.ID_Prodotto HAVING c >= 2; /* Qui ">= 2" è puramente
indicativo */
A questo punto crei due indici su prod1 e prod2 e fai
select prod1, prod2, conto from best_cache where prod1 = ID_1 UNION select
prod2, prod1, conto from best_cache WHERE prod2 = ID_1; /* :-) */
La tabella cache puoi farla corta quanto vuoi.
Leonardo SE&O
-- 
Dawn is near, the time is short (Human aircraft! Hard to port!)
We eight reindeers of the night work as one in silent flight.
Let not one damn house pass by (Who taught that guy how to fly?)
Each year sees more girls and boys: how many of them can we bring toys?

Grazie Leonardo,
credo proprio adotteremo questa soluzione, che mi sembra ben più articolata della nostra.
Troppo gentile. Grazie ancora
