5

Prima di tutto, mi scuso per la lunghezza. Questo è un po 'complicato (almeno per me).Complicato struttura dati MySQL/problema di manipolazione

sfondo sul database:

Ho un prodotti, variabili e prezzi tavolo. "Prodotti" sono le informazioni principali relative a un prodotto (descrizione, titolo, ecc.). I "prezzi" contengono informazioni su ciascun prezzo (prezzo, costo, quantità minima richiesta, costo di spedizione, ecc.), Poiché alcuni prodotti possono avere più di un prezzo (ad esempio, un widget da 10 "è un prezzo diverso da un widget da 12") . Le "variabili" sono variazioni del prodotto che non cambiano il prezzo, come colore, dimensioni, ecc.

Inizialmente (quando ho creato questo database circa 7 anni fa) avevo le informazioni variabili memorizzate nel primo prezzo in un elenco di prezzi per lo stesso prodotto in un formato delimitato da pipe (sì, lo so, badbadbad). Questo ha funzionato in generale, ma abbiamo sempre avuto un problema, tuttavia, dove a volte una variabile non sarebbe coerente tra tutti i prezzi.

Ad esempio, un Widget (prodotto) può essere 10 "o 12" e vendere rispettivamente a $ 10 e $ 20 (prezzi). Tuttavia, mentre il widget 10 "può essere disponibile in blu e rosso (variabili), il widget 12" è disponibile solo in rosso. Abbiamo migliorato questo problema aggiungendo una piccola dichiarazione parentetica nella variabile incongruente come "Red (10" ONLY). Questo tipo di lavoro, ma i clienti non sono sempre così intelligenti e molto tempo è dedicato a correggere gli errori quando un cliente seleziona un widget da 12 "in rosso.

Da allora sono stato incaricato di modernizzare il database e ho deciso di inserire le variabili nella propria tabella e renderle più dinamiche e più facili da abbinare a determinati prezzi, oltre a tenere un inventario più a prova di falsi (è possibile immagina gli incubi).

Il mio primo passo è stato scrivere una stored procedure sul mio test db (per quando eseguo la conversione) per elaborare tutte le variabili esistenti in una nuova tabella delle variabili (e tabella delle etichette, ma non è molto importante, non lo faccio penso). Ho analizzato in modo efficace le variabili e le ho elencate con l'ID prodotto corretto e l'ID prodotto a cui erano inizialmente associati nella tabella delle variabili. Tuttavia, ho capito che questa è solo una parte del problema, dal momento che io (almeno per la trasformazione iniziale del database) voglio che ogni variabile sia elencata come collegata a ciascun prezzo per un determinato prodotto.

Per fare questo, ho creato un altro tavolo, in questo modo:

 
tblvariablesprices 
variablepriceid | variableid | priceid | productid 

che è una relazione molti-a-molti con la tabella delle variabili.

Problemi:

Il mio problema ora è, non so come creare le righe. Posso creare un join di sinistra sui miei prezzi e sulle tabelle delle variabili per ottenere (penso) tutti i dati necessari, ma non so come affrontarlo. My SQL è (mysql 5.0):

SELECT p.priceid, p.productid, variableid, labelid 
FROM tblprices p 
LEFT JOIN tblvariables v ON p.priceid = v.priceid 
ORDER BY productid, priceid 

Questo mi otterrà ogni priceid e ProductID e qualsiasi ids variabili di corrispondenza e di etichette. Questo è un bene in alcuni casi, come ad esempio quando ho qualcosa di simile:

 
priceid | productid | variableid | labelid 
2  | 7   | 10   | 4 
2  | 7   | 11   | 4 
2  | 7   | 12   | 4 
3  | 7   | (null)  | (null) --- another price for product 

perché ora so che ho bisogno di creare un record per priceid 2 e variableids 10, 11, 12, e quindi anche per priceid 3 per quel prodotto.Tuttavia, ho anche ottenere risultati di questo set di dati per i prodotti senza variabili, i prodotti con un prezzo e più variabili, e prodotti con prezzi più e non variabili, per esempio:

 
priceid | productid | variableid | labelid 
2  | 7   | 10   | 4 
2  | 7   | 11   | 4 
2  | 7   | 12   | 4 
3  | 7   | (null)  | (null) 
4  | 8   | (null)  | (null) --- 1 price no variables 
5  | 9   | 13   | 5  --- mult vars, 1 price 
5  | 9   | 14   | 5 
5  | 9   | 15   | 6 
5  | 9   | 16   | 6 
6  | 10  | (null)  | (null) --- mult price, no vars 
7  | 10  | (null)  | (null) 
8  | 10  | (null)  | (null) 

Prendendo il set di dati di cui sopra, voglio aggiungere le voci nella mia tabella di tblpricesvariables in questo modo:

 
variablepriceid | variableid | priceid | productid 
1    | 10   | 2  | 7 
2    | 11   | 2  | 7 
3    | 12   | 2  | 7 
4    | 10   | 3  | 7 
5    | 11   | 3  | 7 
6    | 12   | 3  | 7 
7    | 13   | 5  | 9 
8    | 14   | 5  | 9 
9    | 15   | 5  | 9 
10    | 16   | 5  | 9 

ho migliaia di record da processo, in modo ovviamente facendo questa operazione manualmente non è la risposta. Qualcuno può almeno indicarmi la direzione corretta, se non viene in mente una sproc che potrebbe gestire questo tipo di operazione? Gradirei anche qualsiasi commento su come organizzare e/o strutturare meglio questi dati.

Grazie mille per aver letto tutto questo e per avermi aiutato.

risposta

2

ne dite:

SELECT DISTINCT b.variableid, a.priceid, a.productid 
FROM tblprices AS a 
JOIN tblprices AS b ON a.productid = b.productid 
WHERE b.labelid IS NOT NULL 
ORDER BY priceid; 

+------------+---------+-----------+ 
| variableid | priceid | productid | 
+------------+---------+-----------+ 
|   10 |  2 |   7 | 
|   11 |  2 |   7 | 
|   12 |  2 |   7 | 
|   10 |  3 |   7 | 
|   11 |  3 |   7 | 
|   12 |  3 |   7 | 
|   13 |  5 |   9 | 
|   14 |  5 |   9 | 
|   15 |  5 |   9 | 
|   16 |  5 |   9 | 
+------------+---------+-----------+ 

inserimento in tblvariables viene lasciato come esercizio per il lettore;)

+0

santo schifo. questo è ESATTAMENTE quello di cui avevo bisogno (con alcune aggiunte minori, ovviamente). wow amico. Wow. – Jason

+0

Benvenuto. La prossima volta, tuttavia, se si segue il consiglio di Dean e si aggiungono le istruzioni CREATE e INSERT, si risparmia così tanto tempo nella riproduzione della struttura del database. – chris

+0

ah, ok vedo quello che stai dicendo. Mi dispiace. grazie per aver preso il mio problema apparentemente enorme (per me) e farlo sembrare un gioco da ragazzi. jeez – Jason

1

penso che questo dovrebbe funzionare:

SELEZIONA v.variableid, p.productid, p.priceid DA tblvariables v, p tblprices DOVE v.priceid IN (SELECT s.priceid DA tblprices s DOVE s.productid = p.productid);

La prossima volta, è possibile inserire creare e inserire istruzioni per replicare la configurazione? Grazie.

+0

Yup, crea e inserisce sarebbe davvero risparmiato un po 'di tempo – chris

+0

grazie tanto dean ... questo è anche una soluzione adatta (ottiene i dati corretti), ma chris impiega circa 7 secondi per eseguirla e il tuo richiede circa 1-2 minuti. grazie per l'aiuto! – Jason