Zapytanie mysql wyświetlające również powtarzające się rekordy


(morriat) #1

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.

 

Pozdrawiam i dziękuję za każda okazaną pomoc

 

 


(ziggurad) #2

Dla mnie powinieneś zmienić coś “wyżej” niż tego SQL, bez sensu zwracać powtórzone dane, może powiesz o szerszym kontekście i spróbujemy CI pomóc?


(Fizyda) #3

Zapytanie powinno zwrócić z powtórzeniami, pytanie czy takie powtórzenia możesz wprowadzić do tabeli.


(angh) #4

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.


(morriat) #5

Przepraszam, że piszę tak późno

ale wracając do tematu

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 :confused: 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


(Fizyda) #6

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ć.


(Luna S20) #7

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/';
			   }

Wyświetli ci:


(angh) #8

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.


(Fizyda) #9

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.


(angh) #10

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.


(Fizyda) #11

Przecież to są podstawy.


(angh) #12

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.