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.
święte bzdury. to jest DOKŁADNIE to, czego potrzebowałem (oczywiście z niewielkimi dodatkami). wow koleś. łał. – Jason
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
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