![]() |
![]() |
![]() ![]()
Post
#1
|
|
![]() Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 18.04.2004 Ostrzeżenie: (0%) ![]() ![]() |
mam dwie tebele polaczone ze soba polem pole_id. Chce pobrac dane z tabeli_1, ale tylko te wiersze o polu_id, korego wartosc nie znajduje sie w tabeli_2.
Czyli jezeli mamy pole_id o wartosci 2 w obu tabelach, to aby nie zwracal mi tego pola. Natomiast jezeli wartosc pola_id znajduje sie tylko w tabeli_1, aby pobral ta wartosc. -------------------- Bez podpisu! :P
|
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 712 Pomógł: 23 Dołączył: 27.10.2003 Skąd: z kontowni Ostrzeżenie: (0%) ![]() ![]() |
Tak ciężko zajrzeć do manuala i poczytać o złączeniach? Radzę to zrobić, bo to które pokazałem, jest akurat najprostrzym ze złączeń, a bez nich ani rusz. -------------------- "Coś się kończy, coś się zaczyna." Andrzej Sapkowski
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 16.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#4
|
|
![]() Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 18.04.2004 Ostrzeżenie: (0%) ![]() ![]() |
a po co uzywac tutaj aliasow? koniecznie?
nazwy tabel sa krotkie -------------------- Bez podpisu! :P
|
|
|
![]()
Post
#5
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
aliasy nie są tu niezbedne, ale są krotrze nawet o tych twoich "krótkich" tabel.
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#6
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#7
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Ja bym zrobil tak:
-------------------- Brak czasu :/
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#9
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Sposobow jest wiele, to fakt.. ale trzeba sie tez liczyc z optymalizacja zapytan.
Ostatnio robilem dosc skomplikowane zapytanie, najpierw za pomoca subquery, ale bylo nieludzko powolne (kilka zapytan prawie takich samych wykonywalo sie kilka sekund) mimo indexow na wszystkich polach, na ktorych byly jakies warunki. Potem udalo mi sie po dlugich bojach zmienic to na joina (zostalo tylko jedno proste subquery) i czas wykonania spadl ok dziesieciokrotnie. -------------------- Brak czasu :/
|
|
|
![]()
Post
#10
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
@FiDo: Zaciekawiło mnie jeszcze jakby zrobić takie zapytanie, gdyby pola nie nazywały się tak samo (nie używając USING). Bo jeżeli użyjesz ON to przecież nie będzie złączeń z NULL. Czy może LEFT JOIN ... ON .. zwraca pola nawet te, które nie mają swoich odpowiedników?
|
|
|
![]()
Post
#11
|
|
![]() Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 18.04.2004 Ostrzeżenie: (0%) ![]() ![]() |
Spoko, juz sobie poradzilem, juz popbralem, ale teraz trzeba mi je usunac.
Te wyniki ktore dostalem (zarowno z jednej jak i z drugiej tabeli) chce usunac. Moze cos w stylu
to select to by bylo to co wyzej a moze inaczej? Ten post edytował kirkor0 16.12.2005, 23:42:43 -------------------- Bez podpisu! :P
|
|
|
![]()
Post
#12
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
@Jabol: jesli jest LEFT JOIN to juz niewazne jak zapisujesz zlaczenie.. i tak zwraca wszystkie rekordy z tabeli z lewej strony zlaczenia. USING w tym przypadku tylko skraca zapis.
@kirkor0: moze byc tak. -------------------- Brak czasu :/
|
|
|
![]()
Post
#13
|
|
![]() Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 18.04.2004 Ostrzeżenie: (0%) ![]() ![]() |
Ten kod, który podałem nie działa - spodziewałem się tego. To był tylko punkt mojego widzenia.
Co jest źle, a może inaczej? -------------------- Bez podpisu! :P
|
|
|
![]()
Post
#14
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Podaj cale zapytanie jakie wykonales i najlepiej od razu komunikat bledu.
-------------------- Brak czasu :/
|
|
|
![]()
Post
#15
|
|
![]() Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 18.04.2004 Ostrzeżenie: (0%) ![]() ![]() |
Moje zapytanie jest duzo bardziej rozbudowane. Musze uzyc 3 tabel.
I Nr błędu: 1064. Treść błędu: "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE id_pole IN (SELECT table_1.id_pole FROM table_1 LEFT JOIN ta". Ten post edytował kirkor0 17.12.2005, 10:42:12 -------------------- Bez podpisu! :P
|
|
|
![]()
Post
#16
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 717 Pomógł: 0 Dołączył: 12.06.2002 Skąd: Wolsztyn..... Studia: Zielona Góra Ostrzeżenie: (0%) ![]() ![]() |
Jesli chcesz z kazdej tabeli usunac wiersze, ktore nie maja swoich odpowiednikow w pozostalych tabelach to obawiam, ze za jednym zamachem sie tego nie da zrobic tak jak probujesz. Sprobuj to rozbic na osobne zapytania usuwajace z kazdej tabeli.
-------------------- Brak czasu :/
|
|
|
![]()
Post
#17
|
|
![]() Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 18.04.2004 Ostrzeżenie: (0%) ![]() ![]() |
wszystkie pola sa polaczone polem pole_id.
ale mniejsza z tym, bo teraz bylby problem, bo jakbym usunal z jednej tabeli, to SELECT juz nie zwrocilby tych samych rekordow. Wiec moze usunalbym z tabela_1, a potem usunal z innych tabeli te, które nie maja swojego odpowiednika w tabela_1. Tylko jak to zrobic? -------------------- Bez podpisu! :P
|
|
|
![]()
Post
#18
|
|
![]() Grupa: Przyjaciele php.pl Postów: 2 923 Pomógł: 9 Dołączył: 25.10.2004 Skąd: Rzeszów - studia / Warszawa - praca Ostrzeżenie: (0%) ![]() ![]() |
@FiDO
Cytat Potem udalo mi sie po dlugich bojach zmienic to na joina (zostalo tylko jedno proste subquery) i czas wykonania spadl ok dziesieciokrotnie. Oczywiscie left join jest szybszy od podzapytan typu in ale nalezy uwazac na pewne rzeczy. 1 to wystrzegac sie zeby bylo jak najminejsza liczba zlaczen. Teoretycznie max powinno byc 5, kolejna rzeczy podzapytanie z IN sa strasznie wolne, gdzie IN zwraca wiele rekordow. Wiec trudno nieraz dopasowac zeby bylo ok. Ja mniej wiecej robie to w ten sposob ze laduje miliony rekordow w tabele i na zasadzie prob i bledow sprawdzam wszystkie warianty ale trzeba sie liczyc z czasem. -------------------- |
|
|
![]()
Post
#19
|
|
![]() Grupa: Zarejestrowani Postów: 80 Pomógł: 0 Dołączył: 18.04.2004 Ostrzeżenie: (0%) ![]() ![]() |
Nikt nie wie jak?
Mam dwie tabele połączone polem pole_id. Chodzi mi o usunięcie rekordów z jednej tabeli, tych które nie mają swojego odpowiednika w drugiej tabeli. Inaczej mowiac jeżeli w tabeli_2 znajduje sie rekord o polu_id np. 4 i nie istnieje rekord o polu pole_id w tabeli_2, to niech zostanie usunięty. -------------------- Bez podpisu! :P
|
|
|
![]()
Post
#20
|
|
![]() Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
Ja bym to zrobił poprzez
Ale USING jest rozszeżeniem SQL'a dodawanym w postgresie. Nie wiem, jak jest w innych bazach. Musisz poszukać analogicznego sposobu albo zrobić rzeczywiście z subquery. |
|
|
![]() ![]() |
![]() |
Aktualny czas: 21.08.2025 - 17:40 |