Sto lavorando su un algoritmo omaggio per selezionare un cliente in base a ciò che hanno acquistato:
- Se acquistano l'articolo 1, ottengono 1 punto.
- Se acquistano l'elemento 2, ottengono 2 punti.
- Se acquistano l'elemento 3, ottengono 3 punti.
Ogni acquisto nel database ha un item_id
, che posso utilizzare per capire quale oggetto hanno acquistato.
Sto cercando di fare il numero minimo di query al database per evitare che l'utilizzo della memoria salga (ad es. non riesco a recuperare tutti i record e calcolare i punti tutti in memoria), e sto cercando di mettere il minimo peso su MySQL. Ecco cosa mi è venuto in mente:
Passaggio 1: Ottieni punti totali
Faccio tre query count
nel database, moltiplicando il conteggio per il moltiplicatore di punteggio per ciascun elemento, sommando i punteggi moltiplicati e inserendo i risultati in un array. Ad esempio, se ci sono 10 acquisti per l'articolo 1, 10 per l'articolo 2 e 10 per l'articolo 3, l'array results
sarà simile a questo:
[
1 => 10,
2 => 30,
3 => 60
];
Come probabilmente puoi capire, il primo elemento è solo se stesso (10), il secondo elemento è (10 * 2) + 10
( 10 * 2
è il numero di acquisti moltiplicato per il moltiplicatore del punteggio e poi aggiunto all'elemento precedente) . Allo stesso modo, il terzo elemento dell'array è (10 * 3) + 30
.
Passaggio 2: selezionare un numero casuale
In questa fase, scelgo semplicemente un numero casuale compreso tra 1 e 60 (1 e il valore dell'ultimo elemento nell'array).
Passaggio 3: recupero del vincitore
In questa fase, eseguo quasi l'inverso del passaggio 1. Immagina che il numero casuale sia 33. Scopro quale valore è inferiore a questo numero casuale (è l'elemento nell'indice 2), quindi deduco il valore di quell'indice dal mio numero casuale ( 33 - 30 = 3
), quindi divido il resto per il moltiplicatore del punteggio per index + 1
. In questo caso, il moltiplicatore di punteggio per 2 + 1
(numero articolo 3) è 3, quindi divido 3 per 3, che mi dà 1. Quindi recupererò il primo acquisto per l'articolo 3.
È complicato!
Mi ci è voluto un sacco di tempo solo per scrivere questo qui. Ora immagina qualcuno di fronte a un pezzo di codice che aggiunge e moltiplica e sottrae e divide sempre! C'è un modo per renderlo più semplice?
Non mi dispiace un po 'di perdita di prestazioni se mi guadagna una migliore leggibilità; Preferisco che il mio codice sia il più leggibile possibile, piuttosto che eseguire bene, ma è difficile da capire.