Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Złożone zapytanie do 3 tabel., ...w zaleznosci od tego czy istnieje wpis w 3 tabelce.
emjot27
post
Post #1





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 4.06.2007

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


Witam ma dość (jak dla mnie) skomplikowane zapytanie. Mam następujące tabelki
dokumenty, kontrahenci i bufor. W tabelce dokumenty jest odwołanie do tabelki kontrahenci po id danego kontrahenta. Po za tym w tabelce dokumenty jest Boolenowskie pole bufor mówiące o tym czy dokument jest buforze czy też nie. Jeżeli jest w buforze, to w tabelce bufor jest odpowiedni zapis z odwołaniem do tabelki dokumenty z jego id. Dodatkowo, w bazie bufor jest pole status typu enum o wartościach 'nowy' lub 'edycja' lub 'wolny'.
Teraz jak zrobić zapytanie tak, aby wybrać z bazy dokumentów dane razem z danymi kontrahenta ale tylko te rekordy które nie są nowe czyli posiadają zapis w bazie bufor, z polem status!='nowy'
Próbowałem zrobić coś takiego, ale gdzieś pewnie robie błąd:

  1. "SELECT * FROM `dokumenty` AS d, `kontrahenci` AS k, `bufor` AS b WHERE d.kontr_wchodz = k.idkontrahenci AND d.numer_wchodz LIKE '%".$dok_nr1."%' AND d.data_wplyw_wchodz LIKE '%".$dok_dat1."%' AND d.data_nad_wchodz LIKE '%".$dok_dat2."%' AND k.nazwa_kontr LIKE '%".$dok_kontr."%' AND CASE WHEN (b.id_buf_dok = d.idwchodzaca AND d.bufor = 'tak' AND b.stan_buf_dok != 'nowy' ) THEN 'true' END"


Właśnie w tym CASE czuję największą szanse...ale czy tak można robić zapytanie... Nigdy nie stosowałem takiego zapytania, ale teraz czuje, że tylko to może mi pomóc, tylko nie bardzo wiem jak to razem wszystko ładnie połączyć.

Bardzo proszę o pomoc.
Pozdrawiam.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
rygiel
post
Post #2





Grupa: Zarejestrowani
Postów: 17
Pomógł: 1
Dołączył: 26.11.2007
Skąd: Łódź

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


Uwaga! zapytania są schematyczne nie muszą działac po wklejeniu do kodu (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)

Wersja nr 1

SELECT
...
FROM
dokumenty d
JOIN bufor b ON d.iddok = b.id_buf_dok
JOIN kontrahenci k ON cośtam cośtam
WHERE
b.status!='nowy'

To zapytanie zwróci wszystkie rekordy ze statusem "nowy" które mają połaczenie między tabelami dokumenty, bufor, kontrachenici


SELECT
...
FROM
dokumenty d
LEFT JOIN bufor b ON d.iddok = b.id_buf_dok
JOIN kontrahenci k ON cośtam cośtam
WHERE
b.status!='nowy'
To zapytanie zwróci to samo. LEFT JOIN używamy tylko wtedy gdy chcemy salic tabelkę z rekordami do których nie ma dowiązań. Jeśli wywali tu to co jest w WHERE to zwróci Ci wszystkie dokumenty te co sa w buforze i i ich nie ma w buforze.
---
Zauważyłem że dziwnie połączyłeś w nowym zapytaniu dałeś JOIN a puźniej przecinek następne pole.
Chyba źle też łączysz pola JOIN lepiej łącz id_z_tabeli1 = id_z_tabeli2 a warunek daj w WHERE

Moim zdaniem lepiej odzwyczaić sie łączenia tabel bez JOIN (IMG:http://forum.php.pl/style_emoticons/default/smile.gif)


http://dev.mysql.com/doc/refman/5.1/en/join.html
Go to the top of the page
+Quote Post
emjot27
post
Post #3





Grupa: Zarejestrowani
Postów: 35
Pomógł: 0
Dołączył: 4.06.2007

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


Cytat(rygiel @ 19.12.2007, 13:37:26 ) *
Zauważyłem że dziwnie połączyłeś w nowym zapytaniu dałeś JOIN a puźniej przecinek następne pole.
Chyba źle też łączysz pola JOIN lepiej łącz id_z_tabeli1 = id_z_tabeli2 a warunek daj w WHERE

Hmm...no właśnie, ale coś mi nie wychodzi z tym joinem gdy go próbuje wywołać drugi raz łącząc tabele dokumenty z kontrahentami.
mam tak: (schematycznie)
  1. "SELECT * FROM dokumenty d LEFT JOIN bufor b ON d.iddok= b.id_bufor JOIN kontrahenci k ON d.kontr = k.idkontrahenci WHERE b.status!='nowy'"

Wywala mi błąd:
Something is wrong in your syntax obok 'ON d.kontr = k.idkontrahenci WHERE b.status!='nowy'' w linii 1

Ufffff udało się (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
w powyższym kodzie musiałem również użyć LEFT JOIN aby połączyć tabele kontrahentów i dokumentów ale to nadal nie rozwiązywało sprawę, bo pokazywały mi się tylko te rekordy dokumentów, które mają swe zapisy w buforze. Musiałem pokombinować z warunkami i UDAŁO SIĘ (IMG:http://forum.php.pl/style_emoticons/default/biggrin.gif)
o to co mi wyszło...
  1. "SELECT * FROM dokumenty d LEFT JOIN bufor b ON d.iddok= b.id_bufor LEFT JOIN kontrahenci k ON d.kontr = k.idkontrahenci WHERE (d.bufor='nie' OR (b.status!='nowy' AND b.status!='wolny'))"


Ogólnie strasznie dla mnie to zakręcone - ale ważne, ze działa. Mam tylko, nadzieje, że w trakcie "prania" nie wyjdą z tego jakieś "krzaczki"
Póki co, to dzięki za pomoc. - cały dzionek przez to zmarnowałem :/

Ten post edytował emjot27 19.12.2007, 14:26:59
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 3.10.2025 - 14:47