5

Po pierwsze, przepraszam za długość. To trochę skomplikowane (przynajmniej dla mnie).Skomplikowany problem struktury danych/manipulacji MySQL

Tło na bazie:

Mam produktów, zmienne, a ceny tabeli. "Produkty" to główne informacje dotyczące produktu (opis, tytuł itp.). "Ceny" zawierają informacje o każdej cenie (cena, koszt, minimalna wymagana ilość, koszt wysyłki itp.), Ponieważ niektóre produkty mogą mieć więcej niż jedną cenę (na przykład widget o rozmiarze 10 "to inna cena niż widżet 12") . "Zmienne" to odmiany produktu, które nie zmieniają ceny, takie jak kolor, rozmiar, itp.

Początkowo (kiedy zbudowałem tę bazę danych około 7 lat temu) miałem zmienne informacje przechowywane w cenie pierwszej w lista cen dla tego samego produktu w formacie rozdzielanym potokami (tak, wiem, badbadbad). To działało ogólnie, ale zawsze mieliśmy problem, w którym czasami zmienna nie byłaby spójna wśród wszystkich cen.

Na przykład widżet (produkt) może mieć rozmiar 10 "lub 12" i sprzedawać odpowiednio za 10 USD i 20 USD (ceny). Jednak, chociaż widżet 10 "może być dostępny w kolorze niebieskim i czerwonym (zmienne), to widżet 12" jest dostępny tylko w kolorze czerwonym. Usprawniliśmy ten problem, dodając małe nawiasowe wyrażenie w niestałej zmiennej, takiej jak "Red (TYLKO 10"). Tego typu prace, ale klienci nie zawsze są tak inteligentni i poświęca się dużo czasu na naprawianie błędów, gdy klient wybierze widżet 12 "na czerwono.

Od tego czasu zlecono mi modernizację bazy danych i postanowiłem umieścić zmienne w ich własnych tabelach, dzięki czemu będą one bardziej dynamiczne i łatwiejsze do dopasowania do określonych cen, a także zachować bardziej odporny na ataki ekwipunek (można Wyobraź sobie koszmary).

Pierwszym krokiem było napisanie procedury przechowywanej na moim serwerze testowym (w przypadku konwersji) w celu przetworzenia wszystkich istniejących zmiennych w nową tabelę zmiennych (i tablicę etykiet, ale to nie jest naprawdę ważne, nie chcę myślę). Skutecznie przeanalizowałem zmienne i opatrzyłem je poprawnym identyfikatorem produktu oraz identyfikatorem produktu, z którym początkowo były powiązane w tabeli zmiennych. Zdałem sobie jednak sprawę, że jest to tylko część problemu, ponieważ (przynajmniej dla początkowej transformacji bazy danych) chcę, aby każda zmienna była wymieniona jako związana z każdą ceną dla danego produktu.

Aby to zrobić, stworzyłem inną tabelę, tak:

 
tblvariablesprices 
variablepriceid | variableid | priceid | productid 

która jest wiele-do-wielu z tabelą zmiennej.

Problemy:

Mój problem jest teraz, nie wiem, jak tworzyć wiersze. Mogę utworzyć lewe połączenie na moich tabelach cen i zmiennych, aby uzyskać (jak sądzę) wszystkie niezbędne dane, po prostu nie wiem, jak to zrobić. My SQL jest (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 

To dostanie mnie za każdym priceid i productid i wszelkie dopasowanie zmiennych i etykiet identyfikatory. To jest dobre w niektórych przypadkach, na przykład gdy mam coś takiego:

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

bo teraz wiem, że trzeba utworzyć rekord priceid 2 i variableids 10, 11, 12, a następnie także na priceid 3 dla tego produktu.Jednak ja również uzyskać wyniki z tego zestawu danych dla produktów bez żadnych zmiennych, produktów z jednej cenie i wielu zmiennych oraz produktów z wieloma cenami i bez zmiennych, na przykład:

 
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) 

Biorąc powyższy zestaw danych, chcę dodawanie wpisów na moim stole tblpricesvariables tak:

 
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 

mam tysiące rekordów do procesu, więc oczywiście to robić ręcznie, nie jest odpowiedzią. Czy ktoś może wskazać mi przynajmniej właściwy kierunek, jeśli nie wymyślić sproceka, który poradzi sobie z tego rodzaju operacją? Z zadowoleniem przyjmuję również wszelkie uwagi dotyczące lepszego uporządkowania i/lub struktury tych danych.

Dziękuję bardzo za przeczytanie tego wszystkiego i udzielenie mi pomocy.

Odpowiedz

2

Jak o:

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 | 
+------------+---------+-----------+ 

włożeniem tblvariables pozostawiamy jako ćwiczenie dla czytelnika;)

+0

święte bzdury. to jest DOKŁADNIE to, czego potrzebowałem (oczywiście z niewielkimi dodatkami). wow koleś. łał. – Jason

+0

Twoje powitanie. Następnym razem skorzystaj z porad Dean i dodaj instrukcje CREATE i INSERT, oszczędzając tyle czasu na odtworzenie struktury bazy danych. – chris

+0

ah, ok, widzę, co mówisz. Przepraszam. dziękuję za wzięcie mojego pozornie wielkiego problemu (dla mnie) i sprawienie, że będzie to dziecinnie proste. Jezu – Jason

1

myślę, że to powinno działać:

SELECT v.variableid, p.productid, p.priceid OD tblvariables v tblprices p GDZIE v.priceid IN (SELECT s.priceid OD tblprices s GDZIE s.productid = p.productid);

Czy następnym razem można dodawać instrukcje tworzenia i wstawiania, aby powielić konfigurację? Dzięki.

+0

Tak, tworzy i wstawia rzeczywiście zapisywane trochę czasu – chris

+0

dzięki tyle Dean ... to jest również odpowiednie rozwiązanie (dostaje poprawne dane), ale chris trwa około 7 sekund, aby wykonać, a twoja zajmuje około 1-2 minut. dzięki za pomoc! – Jason