Forum Gry Filmy i Seriale Tech Ogólne Archiwum Regulamin

Forum: Pomoc przy BAZIE DANYCH

05.12.2012 00:01
1
Fabianos
53
Konsul
Image

Pomoc przy BAZIE DANYCH

Witam, stworzyłem sobie taką baze danyh (ma to być taka mini wypożyczalnia meczów piłkarskich). Mam problem, gdy chce wyświetlić nazwy obydwu drużyn, date ich meczu oraz wynik. Próbuje zapytaniem poniżej jednak wyrzuca jakiś błąd. W czym może być problem?
SELECT DRU_DRUZYNY, DRU_DRUZYNY, MEC_DATA_MECZU, MEC_WYNIK
FROM MECZ, DRUZYNY WHERE MEC_ID_DRUZYNY1=DRU_ID_DRUZYNY AND MEC_ID_DRUZYNY=DRU_ID_DRUZYNY;

05.12.2012 01:16
2
odpowiedz
poltar
176
Senator

"SELECT DRU_DRUZYNY, DRU_DRUZYNY ..."

Wybierasz w selekcie dwa identyczne pola?

Nie wczytujac sie z strukture bazy bo lece juz do roboty - jesli z jednej tabeli to nie ma sensu, jesli z dwoch to bedzie cos w stylu

SELECT TABELA_1.DRU_DRUZYNY AS DRU1, TABELA_2.DRU_DRUZYNY AS DRU2,

/edit. A widze ze to jedna tabela, tylko to zapytanie jest troche bez sensu, ma co najmniej dwie niejednoznacznosci ktorych baza nie przeskoczy

SELECT DRU_DRUZYNY, MEC_DATA_MECZU, MEC_WYNIK
FROM MECZ, DRUZYNY WHERE MEC_ID_DRUZYNY1=DRU_ID_DRUZYNY OR MEC_ID_DRUZYNY=DRU_ID_DRUZYNY;

AND zamieniony na OR i zapytanie wyciagnie ci obie nazwy druzyn z tabeli druzyny jako result z dwoma rekordami (w swoim pytaniu pytales tak naprawde o rekord w ktorym id druzyny jest jednoczesnie taki i taki - juz pomijajac niejednoznacznosc z wyciaganych polach)

Ale to tak naprawde po jednym rzucie oka bo sie spiesze

05.12.2012 09:34
3
odpowiedz
Tuminure
106
Senator

/edit. A widze ze to jedna tabela,
To dwie tabele (FROM MECZ, DRUZYNY).

Takie rzeczy logiczniej załatwia się joinem - być może da się przez dodanie kolejnej tabeli do FROM ale jakoś nie jestem zwolennikiem takich rozwiązań.

Niżej polecenie, które wybiera dwie nazwy drużyn.

SELECT `LEWA`.`DRU_DRUZYNY` AS `LEWA_DRUZYNA`, `PRAWA`.`DRU_DRUZYNY` AS `PRAWA_DRUZYNA`
FROM `MECZ`
LEFT JOIN `DRUZYNY` AS `LEWA`
ON `MECZ`.`MEC_ID_DRUZYNY1` = `LEWA`.`DRU_ID_DRUZYNY`
LEFT JOIN `DRUZYNY` AS `PRAWA`
ON `MECZ`.`MEC_ID_DRUZYNY` = `PRAWA`.`DRU_ID_DRUZYNY`

05.12.2012 11:44
4
odpowiedz
poltar
176
Senator

Ja tu widze chec wybrania z jednej tabeli "druzyny" dwoch druzyn zapisanych w rekordzie tabeli "mecz". Stad kionstrukcja zwyklego selecta z jednym prostym warunkiem.

05.12.2012 12:47
kaczmen
👍
5
odpowiedz
kaczmen
98
GINOBILI!!!

dla mnie rozwiązanie Tuminure jest dobre, sam robię obecnie coś w tym stylu

05.12.2012 12:50
6
odpowiedz
poltar
176
Senator

Kazde rozwiazanie ktore dziala zgodnie z oczekiwaniami jest z zasady prawidlowe :)

Ja nie lubie jednak niepotrzebnie operowac joinami jesli nie jest to absolutnie konieczne. W kazdym razie nie wazne jak, byle dzialalo ;)

05.12.2012 13:23
7
odpowiedz
Fabianos
53
Konsul

Witam, dziękuje wam za pomoc, ale coś mi to nie działa. Poltar - próbowałem też dawać OR, ale wtedy wyciąga mi tylko jedną drużyne z bazy.
Niestety dopiero raczkuje i ucze się podstaw baz danych więc polecenie join jeszcze mi jest obce, ale próbowałem właśnie tym poleceniem co napisał Tuminure wybrać dwie nazwy drużyn, jednak po skompilowaniu troszke sie zdziwiłem, bo kompilator tak jakby tego polecenia w ogóle nie widział, zostało ono całkowicie pominięte.
W czym może być problem?

05.12.2012 13:33
Loczek
8
odpowiedz
Loczek
160
El Loco Boracho

Tuminure:
'FROM MECZ, DRUZYNY WHERE MEC_ID_DRUZYNY1=DRU_ID_DRUZYNY [...]' to też join :P

05.12.2012 13:35
9
odpowiedz
Tuminure
106
Senator

@poltar
Nie przyjrzałem się Twojemu zapytaniu wcześniej, po przeczytaniu wcześniej zacytowanego fragmentu.

Czy Twoje zapytanie jest poprawne?
1. Jeżeli będziemy chcieli sprawdzić mecz rozegrany przez drużynę X i drużynę Y - Twoje zapytanie się posypie (wyświetli wszystkie mecze rozegrane przez drużynę X i Y).
2. Jeżeli będziemy chcieli sprawdzić wszystkie mecze rozegrane przez drużynę X - Twoje zapytanie się posypie. (wyświetli tylko nazwę drużyny, której wyników szukamy, nie wyświetli nazwy drużyny przeciwnika).
3. Nie rozróżnisz MEC_ID_DRUZYNY od MEC_ID_DRUZYNY1, czyli nie sprawdzisz kto był zwycięzcą, a kto przegranym - dostaniesz tylko wynik i dwie nazwy drużyn, biorące udział w meczu... czasem w dobrej kolejności, a czasem w złej.
4. Wyciągasz z bazy powielone dane (wszystkie dane z kolumny MECZ będą wybierane dwukrotnie), co przy dużej ilości danych może stanowić problem.

Zatem - moim zdaniem Twoje zapytanie jest poprawne, o ile nie mamy zamiaru nim robić niczego, co wymieniłem powyżej.

@Loczek
Wiem... ale czy
'FROM MECZ, DRUZYNY WHERE MEC_ID_DRUZYNY1=DRU_ID_DRUZYNY OR MEC_ID_DRUZYNY=DRU_ID_DRUZYNY'
to nadal join? Jeżeli tak, to... jaki?

@down
Racja - z przyzwyczajenia wszystkie nazwy kolumn i tabel piszę małymi literami... przy okazji zaktualizowałem swoje zapytanie

05.12.2012 13:37
kaczmen
10
odpowiedz
kaczmen
98
GINOBILI!!!

SELECT
MECZ.MEC_ID_MECZU,
MECZ.MEC_DATA_MECZU,
druzyna1.DRU_DRUZYNY,
druzyna2.DRU_DRUZYNY
LEFT JOIN DRUZYNY AS druzyna1
ON MECZ.MEC_ID_DRUZYNY1 = druzyna1.DRU_ID_DRUZYNY
LEFT JOIN DRUZYNY AS druzyna2
ON MECZ.MEC_ID_DRUZYNY = druzyna2.DRU_ID_DRUZYNY

bo nazwy tabel są case sensitive?

05.12.2012 13:47
Loczek
11
odpowiedz
Loczek
160
El Loco Boracho

Tuminure: tak - Inner join (część wspólna z 2 tabel). Ilość warunków nie wpływa na typ joina :)

Mógłbyś napisać zapytanie w ten sposób:
INNER JOIN table_name2
ON (table_name1.column_name=table_name2.column_name AND/OR ... więcej warunków)

05.12.2012 14:02
12
odpowiedz
Fabianos
53
Konsul

Dzięki wielkie za pomoc, nie ogarniam jeszcze tego joina do końca - kompilator (Oracle sql plus) chyba też nie, bo po dodaniu tego zapytania wyświetla się liczba linijek kodu owego joina i tyle...

Forum: Pomoc przy BAZIE DANYCH