![]() |
![]() ![]() |
![]() |
![]() ![]()
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. |
|
|
![]()
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%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 1 Pomógł: 0 Dołączył: 16.12.2005 Ostrzeżenie: (0%) ![]() ![]() |
Oczy 'nazwa' i 'data' to są pola przykładowe pobierane z tabeli_1 (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif) |
|
|
![]()
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 |
|
|
![]()
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.
|
|
|
![]()
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%) ![]() ![]() |
|
|
|
![]()
Post
#8
|
|
Grupa: Przyjaciele php.pl Postów: 1 467 Pomógł: 13 Dołączył: 22.02.2003 Ostrzeżenie: (0%) ![]() ![]() |
Hehe, ależ ten sql wypasiony (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) . |
|
|
![]()
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. |
|
|
![]()
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 |
|
|
![]()
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. |
|
|
![]()
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? |
|
|
![]()
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.
|
|
|
![]()
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 |
|
|
![]()
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.
|
|
|
![]()
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? |
|
|
![]()
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. |
|
|
![]()
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: 20.09.2025 - 09:13 |