Witam, jestem początkujący w bazach danych, przeszukałem google i niestety nic nie znalazłem co by mogło mi pomóc.
Problem polega na tym, że mam zapytanie do bazy
SELECT * FROM `colorlist` WHERE `id` IN(200005, 200025, 209999, 200005, 200001, 200002)
gdzie w bazie o poniższym wyglądzie dane numery mają swój odpowiednik w nazwie koloru
| id | name |
| 200005 | żółty |
| 200025 | brązowy |
| 209999 | zielony |
| 200001 | czerwony |
| 200002 | biały |
wykonanie tego zapytania zwraca mi wartości
200005 żółty
200025 brązowy
209999 zielony
200001 czerwony
200002 biały
Czyli zapytanie działa prawidłowo ale chodzi mi o to aby zwróciło też wartość która się powtarza i aby wartość powyższego zapytania prezentowała się następująco
200005 żółty
200025 brązowy
209999 zielony
200005 żółty
200001 czerwony
200002 biały
Chodzi tylko o to jak zmodyfikować zapytanie aby zwróciło też powtórzenia.
ID to prawdopodobnie klucz glowny, wiec ta informacja jest zapisana w bazie tylko raz. Zbior zawiera tylko niepowtarzalne rzeczy. Powtorzenie 2 razy 2005 nie spowoduje, ze ta informacja zostanie wyswietlona dwukrotnie. Po prostu prosisz DB o wyswietlenie wszystkich wierszy spelniajacych podany warunek, i to wlasnie dostajesz.
Cala pozostala funkcjonalonsc powinna byc wtedy wykonana na maszynie wykonujacej zapytanie. Masz zle zalozenia i probujesz dopasowac system do tych zalozen, ale powinienes dzialac odwrotnie. To, co chcesz osiagnac jest po prostu nieco niedorzeczne i musisz miec dokladnie opisane wymaganie dla takiej prezentacji danych, ale i tak to musi byc zrobione po stronie aplikacji, a nie DB.
w polu id mam około 800 rekordów z czego każdy ma swój odpowiednik w formacie tekstowym w polu name (czyli nazwa koloru pod danym kodem)
Ogólnie ma to mieć za zadanie “przetłumaczenie” z ciągu cyfr na nazwę koloru przypisaną np do 000025.
chcę stworzyć mini translator dla bazy ponad 19000 produktów, ponieważ nie mają one opisanego koloru jako nazwy np żółty a jest 200005
i kilka set produktów ma kolor 200005 i wpisywanie tego z palca jest nieco męczące a do ilości ponad 19000 to jest już kosmos
dlatego wrzucając ciąg cyfr oznaczających kolor chciałbym uzyskać przetłumaczony ciąg nazw kolorów z powtórzeniami.
Więc gdybym wpisał nawet raz po razie 000025, 000025, 000025 w zapytaniu
to powinno mi zwrócić
brązowy
brązowy
brązowy
dodam też że całość jest wykonywana w skrypcie php i wartości są pobierane z pola formularza
potrzebne mi coś na wzór odwrotności select distinct ale zwracające wartość tyle razy ile ją podałem a nie tylko raz jeśli się powtarza
no dokładnie tak dostaje to o co zapytałem i system zwraca mi to tak jak powinien i właśnie chodzi mi o to jak zmodyfikować zapytanie aby zwracało wynik z powtórzeniami.
Jak też na początku wspomniałem jestem laikiem w tym temacie i większość instrukcji czerpie wiadomo skąd dlatego tez to co piszę może wydać się chaotyczne
To tak nie działa, czegoś takiego nie zrobisz w SQL, klauzura IN sprawdza czy wartość z lewej jest wartością jedną z tych z prawej strony. Jeśli podasz 10 razy tą samą wartość albo 1 raz to nie ma to znaczenia wynik będzie taki sam. Jeśli miałbyś w bazie danych więcej niż 1 raz umieszczoną tą samą liczbę to w tedy zwróci Ci takie zapytanie wszystkie wiersze w których ta liczba się zgadza.
Ale jeśli na tych cyfrach masz założony primary key to te wartości w tabeli nie mogą się powtarzać.
To co chcesz uzyskać z bazy jest bezsensowne i chyba nikt nie wpadłby na pomysł robienia czegoś takiego, dlatego nie da się takich danych wyciągnąć z bazy danych.
Efekt możesz osiągać jeśli podejdziesz do tematu trochę inaczej. Najpierw pobierzesz “słownik” z bazy danych dla wartości które cię interesują, a dopiero potem użyjesz go tyle razy ile będziesz chciał. Jeśli nie napisałem wystarczająco zrozumiale, napisz jutro jak będę wypoczęty postaram się bardziej to zobrazować i wytłumaczyć.
No, ktoś tu słusznie zauważył, że skoro w ‘id’ masz wartość koloru… Co mamy ci powiedzieć? Id powinien być unikatowy, robisz mysql’a w balona po prostu.
id | name | color
22 | czerwony | FFAAAA
Wtedy, by wyświetlić wszystko poprawnie, wybierasz odpowiadające rekordy poprzez COUNT, następnie tworzysz zapytanie o tym samym warunku, którego limit to wynik COUNT’a, i wynik wrzucasz do pętli. I pięknie wyświetla kolejne rekordy.
Gotowiec:
//Sprawdzamy ile rekordów spełniających warunek cośtam jest w bazie:
$szukaj = mysql_query("SELECT COUNT(*) as kolorki FROM `colorlist` WHERE cośtam");
$znalezione = mysql_fetch_assoc($szukaj);
$wszystkie = $znalezione['kolorki'];
//Teraz tworzymy zapytanie, którego wyniki chcemy wrzucić w pętlę:
$zapytanie = "SELECT * FROM `colorlist` WHERE cośtam LIMIT $wszystkie";
$wynik = mysql_query($zapytanie) or die (mysql_error());
//Teraz czas zapętlić wyświetlanie wyników:
while($kolor = mysql_fetch_array($wynik))
{
$nazwa = $kolor['name'];
$wartosc = $kolor['color'];
//I wyświetlamy:
echo 'Nazwa: '.$nazwa.', Wartość: '.$wartosc.'br/';
}
Morriat, Twoje podejscie jest dosc mocno dookola. Poza tym, brakuje wciaz wielu danych. Nie wiem, czy chcesz przetlumaczyc te wartosci na stronie, w formularzu, czy tez przed generacja strony. Ale do rzeczy. Powiedzmy, ze masz dane w formie Array Tx=
2xxx00 <kolor>
2xxx01 <kolor>
2xxx02 <kolor>
2xxx00 <kolor>
2xxx00 <kolor>
i wszystko chcesz wyswietlic na stronie w formie tabeli. Zanim to zrobisz, musisz zmienic wszystki <kolor> na prawidlowe wartosci. Najpewniejsza rzecz, aby to zrobic, to - jezeli wyswietlasz np. 5 wierszy w jednym czasie zrobic zapytanie do DB, ktore zwroci Ci np. array Ty=
2xxx00: zolty
2xxx01: niebieski
2xxx02: czerwony
i wykonac tlumaczenie (bardzo, bardzo pseudo kod, Ty to jest associative array i mozesz wyciagac dane po kluczu):
foreach (tx as x)
Dostaniesz wtedy dane z prawidlowymi kolorami, ktore potem spokojnie mozesz wyswietlic lub uzyc.
Wpadłem jeszcze na jeden pomysł jak to można zrobić, ale musisz podać dokładną strukturę tabel w bazie bez tego nie powiem Ci czy to wykonalne w Twoim przypadku czy nie i jak to zrobić.
Ogólnie można by to zrobić za pomocą left joina id_kolor z produktów z id_kolor z słownika.
Fizyda, nie ucz go biegac jak jeszcze chodzic nie potrafi;) Mozna lamac reguly ale tylko wtedy, jezeli je sie dobrze zna. Jego problem nie polega na tym, ze DB pracuje zle, tylko na tym, ze na wczesnych etapach cos pokrecil.
Nie wspominajac juz o tym, ze jakiekolwiek dodatkowe obejscia spowoduja znacznie gorsza wydajnosc zarowno DB jak i obciaza mocniej lacze. Wszystkie wymagane dane sa dostepne na front end, wiec po prostu trzeba je madrze wykorzystac.
Jego requirements sa zle sprecyzowane, wiec uzycie join do oszukania systemu jedyne, co spowoduja to bardziej skomplikowany kod, nielogiczny data processing, overhead na DB i network. To, co on chce uzyskac spokojnie da sie zrobic bez uciekania sie do niepotrzebnych operacji po stronie DB.