|
|
||||||
|
#1
|
|
|
|
|
Witam,
Baza danych to MySQL. Dla tabel: CREATE TABLE Plyty ( Id INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT, Autor TEXT, Tytul TEXT, Kategoria INTEGER ); CREATE TABLE Kategorie ( Id INTEGER PRIMARY KEY NOT NULL AUTO_INCREMENT, Nazwa TEXT ); Mam takie oto zapytanie listujace wszystkie albumy muzyczne w bazie: SELECT Autor, Tytul, Nazwa FROM Plyty INNER JOIN Kategorie ON Plyty.Kategoria = Kategorie.Id; W przypadku braku w tabeli "Kategorie" pozycji o numerze ID zgodnym z "Plyty.Kategorie.Id" (brak takiej kategorii lub zostala usunieta) zapytanie zwroci pusty wiesz dla danej płyty. Chcialbym, aby w takim przypadku zapytanie zwróciło pola "Plyta.Autor", "Plyta.Tytul" oraz pole "Kategorie.Nazwa" ustawione na "brak kategorii". Sytuacja taka ma miejsce, gdy kategoria zostala usunieta przez uzytkownika, natomiast przy tworzeniu wpisu w tabeli Plyty kategoria istniala. Interesuje mnie modyfikacja samego zapytania SELECT z jakims warunkiem IF jesli to jest mozliwe. Nie jestem mocny z baz danych dlatego proszę o poradę. |
|
|
|
#2
|
|
|
|
|
> Mam takie oto zapytanie listujace wszystkie albumy muzyczne w bazie:
> > SELECT Autor, Tytul, Nazwa FROM Plyty INNER JOIN Kategorie ON > Plyty.Kategoria = Kategorie.Id; Wylistuje wszyskie rekordy tylko gdy Kategoria w tabeli Plyty ma odpowiednik w tabeli Kategorie. > W przypadku braku w tabeli "Kategorie" pozycji o numerze ID zgodnym z > "Plyty.Kategorie.Id" (brak takiej kategorii lub zostala usunieta) zapytanie > zwroci pusty wiesz dla danej płyty. Nie zwroci pustego wiersza, chyba ze zastosujes LEFT JOIN zamiast INNER JOIN > Chcialbym, aby w takim przypadku zapytanie zwróciło pola "Plyta.Autor", > "Plyta.Tytul" oraz pole "Kategorie.Nazwa" ustawione na "brak kategorii". SELECT p.Autor, p.Tytul, CASE WHEN k.Nazwa IS NULL THEN 'brak kategorii' ELSE k.Nazwa END CASE AS Kategoria FROM Plyty p LEFT JOIN Kategorie k ON p.Kategoria = k.Id Zamiast CASE mozesz zastosowac IFNULL: SELECT p.Autor, p.Tytul, IFNULL(k.Nazwa, 'brak kategorii') AS Kategoria FROM Plyty p LEFT JOIN Kategorie k ON p.Kategoria = k.Id |
|
#3
|
|
|
|
|
Witam,
Użytkownik "mojeza" <najyer> napisał w wiadomości >> Mam takie oto zapytanie listujace wszystkie albumy muzyczne w bazie: >> >> SELECT Autor, Tytul, Nazwa FROM Plyty INNER JOIN Kategorie ON >> Plyty.Kategoria = Kategorie.Id; >Wylistuje wszyskie rekordy tylko gdy Kategoria w tabeli Plyty ma >odpowiednik w tabeli Kategorie. >> W przypadku braku w tabeli "Kategorie" pozycji o numerze ID zgodnym z >> "Plyty.Kategorie.Id" (brak takiej kategorii lub zostala usunieta) >> zapytanie >> zwroci pusty wiesz dla danej płyty. >Nie zwroci pustego wiersza, chyba ze zastosujes LEFT JOIN zamiast >INNER JOIN >> Chcialbym, aby w takim przypadku zapytanie zwróciło pola "Plyta.Autor", >> "Plyta.Tytul" oraz pole "Kategorie.Nazwa" ustawione na "brak kategorii". >SELECT > p.Autor, > p.Tytul, > CASE > WHEN k.Nazwa IS NULL THEN 'brak kategorii' ELSE k.Nazwa > END CASE AS Kategoria >FROM Plyty p > LEFT JOIN Kategorie k ON p.Kategoria = k.Id >Zamiast CASE mozesz zastosowac IFNULL: >SELECT > p.Autor, > p.Tytul, > IFNULL(k.Nazwa, 'brak kategorii') AS Kategoria >FROM Plyty p > LEFT JOIN Kategorie k ON p.Kategoria = k.Id Super, o to mi wlasnie chodzilo. Dziekuje bardzo i pozdrawiam |
|
|
| Podobne wątki | |
| JPA i Select z INNER JOIN Witam Probuje wykonac zapytanie Select wraz ze zlaczeniem INNER JOIN na 2 tabelach. Wzor ze strony [..] a zapytanie SQL to: SELECT Deklaracja.IDDeklaracja,... |
|
| wielokrotne INNER JOIN Witam Jak zadać zapytanie do bazy MySQL z INNER JOIN w przypadku, gdy potrzeba zbudować powiązania jak widać na przykładzie: "SELECT Punkty.X , Punkty.Y FROM Punkty INNER... |
|
| Inner Join wlasnie probuje to skumasz i mi nie idzie powiem tak Create table a( id_a int IDENTITY(1,1) CONSTRAINT pk_a PRIMARY KEY, a varchar(20) NOT NULL) GO Create table b( b int... |
|
| INNER JOIN a RIGHT JOIN? Witajcie! Czy instrukcje 'INNER JOIN' i 'RIGHT JOIN' są równoważne? Czy poniższe przykładowe zapytania zwrócą identyczny wynik? I najważniejsze pytanie: Czy 'INNER JOIN' i... |
|
|
Czasy w strefie GMT. Teraz jest 10:37. | Privacy Policy
|