Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> zapytanie
kirkor0
post
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
Go to the top of the page
+Quote Post
2 Stron V   1 2 >  
Start new topic
Odpowiedzi (1 - 19)
kszychu
post
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%)
-----


  1. SELECT tabela_1.*
  2. FROM tabela_1, tabela_2 WHERE tabela_1.pole_id = tabela_2.pole_id


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
Go to the top of the page
+Quote Post
adasoft
post
Post #3





Grupa: Zarejestrowani
Postów: 1
Pomógł: 0
Dołączył: 16.12.2005

Ostrzeżenie: (0%)
-----


  1. SELECT t1.nazwa, t1.DATA
  2. FROM tabela_1 AS t1
  3. JOIN tabela_2 AS t2 ON t1.pole_id=t2.pole_id
  4. WHERE t1.pole_id<>t2.pole_id


Oczy 'nazwa' i 'data' to są pola przykładowe pobierane z tabeli_1 biggrin.gif
Go to the top of the page
+Quote Post
kirkor0
post
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
Go to the top of the page
+Quote Post
nospor
post
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

Go to the top of the page
+Quote Post
Jabol
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


  1. SELECT tabela_1.*
  2. FROM tabela_1, tabela_2 EXCEPT SELECT tabela_1.*
  3. FROM tabela_1, tabela_2 WHERE tabela_1.pole = tabela_2.pole;


Ten post edytował Jabol 16.12.2005, 19:16:50
Go to the top of the page
+Quote Post
FiDO
post
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:

  1. SELECT t1.*
  2. FROM tabela_1 t1
  3. LEFT JOIN tabela_2 t2 USING(pole_id)
  4. WHERE t2.pole_id IS NULL


--------------------
Brak czasu :/
Go to the top of the page
+Quote Post
Jabol
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 467
Pomógł: 13
Dołączył: 22.02.2003

Ostrzeżenie: (0%)
-----


  1. SELECT *
  2. FROM table_1 WHERE pole_id NOT IN (SELECT pole_id
  3. FROM table_2);
Hehe, ależ ten sql wypasiony winksmiley.jpg.
Go to the top of the page
+Quote Post
FiDO
post
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 :/
Go to the top of the page
+Quote Post
Jabol
post
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?
Go to the top of the page
+Quote Post
kirkor0
post
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
  1. DELETE
  2. FROM tabela_1, tabela_2 WHERE pole_id IN(SELECT....)

to select to by bylo to co wyzej

a moze inaczej?

Ten post edytował kirkor0 16.12.2005, 23:42:43


--------------------
Bez podpisu! :P
Go to the top of the page
+Quote Post
FiDO
post
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 :/
Go to the top of the page
+Quote Post
kirkor0
post
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
Go to the top of the page
+Quote Post
FiDO
post
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 :/
Go to the top of the page
+Quote Post
kirkor0
post
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.
  1. DELETE
  2. FROM table_1, table_2, table_3 WHERE id_poleIN (SELECT table_1.id_pole
  3. FROM table_1 LEFT JOIN table_3 USING(id_pole) LEFT JOIN table_2 USING(id_pole) WHERE (NOW() > DATE_ADD(table_1.pole_1, INTERVAL 1 day) OR NOW() > DATE_ADD(table_2.pole_2, INTERVAL 1 day)) AND (table_1.id_pole=table_2.id_pole OR table_2.id_poleIS NULL) AND table_3.id_pole IS NULL)


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
Go to the top of the page
+Quote Post
FiDO
post
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 :/
Go to the top of the page
+Quote Post
kirkor0
post
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
Go to the top of the page
+Quote Post
SongoQ
post
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.


--------------------
Go to the top of the page
+Quote Post
kirkor0
post
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
Go to the top of the page
+Quote Post
Jabol
post
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
  1. DELETE
  2. FROM tabela_1 USING tabela_2 WHERE tabela_1.pole_id = tabela_2.pole_id;
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.
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 17:40