hilpers


  hilpers > comp.* > comp.bazy-danych

 #1  
03.09.2007, 13:36
`ronin
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  
03.09.2007, 14:14
mojeza
> 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  
03.09.2007, 14:40
`ronin
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