Skocz do zawartości
Threef

[SQL] subquery i przekazywanie wartości

Rekomendowane odpowiedzi

Hej mam problem z zapytaniem SQL. Czy jest możliwosć, i jeżeli tak to jaka, przekazania danych w miejsce ???. Powinno tam wylądować id z `naleznosci` ale to na którym aktualnie jest wykonywane zapytanie.

SELECT kwota FROM `naleznosci`
    WHERE naleznosci.kwota <= 
    (SELECT SUM(platnosci.kwota) FROM `platnosci`
    WHERE platnosci.id_naleznosci=???)

Tabele wyglądają tak:

platnosci:

id | id_naleznosci | kwota

naleznosci:

id | id_uslugi | kwota

 

Edit:

Chyba mam: Correlated Subqueries, chociaż wiem że takie rzeczy powinno się robić na JOIN więc może ktoś poda przykład?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

A jakie pole za ??? ma byc podstawiane? Bo trochę te tabele wyglądają na źle skonstruowane, brak klucza obcego i ciężko powiązać 1-1, 1-N, N-N czy N-1 na podstawie tej struktury.

 

Edit: a już widze -

 

Edit2: weź na http://sqlfiddle.com/ stwórz tabelę i przykładowe dane i podlinkuj, będziemy myśleć dalej :)

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Czyżby moje problemy z JOIN wynikały z tego że klucze obce powinny mieć tę samą nazwę?:

platnosci:

id_platnosci| id_naleznosci | kwota

naleznosci:

id_naleznosci | id_uslugi | kwota

 

Rozwiązanie które podałem pierwszym poście działa, ale chcę to już zrobić na JOIN. Przepisałem całą bazę do SQL Fiddle usuwając zbędne pola. Jest też tam podane poprawne zapytanie, a wartość w klienci.id_agenta='15' jest podawana z PHP. To link: http://sqlfiddle.com/#!2/cc4fd/2 i czekam na jakiekolwiek propozycje i rady na temat łączenia tabel, bo jeszcze nigdy nie zrobiłem tego poprawnie. :rolleyes:

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Mi się wydaje, że to są źle zaprojektowane tabele.

 

Nie chodzi o uzyskanie czegoś podobne go jak w przypadku

 

SELECT * FROM `naleznosci` n INNER JOIN platnosci p ON p.id_naleznosci = n.id ?

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Bardziej jak:

SELECT n.* FROM `naleznosci` n INNER JOIN platnosci p ON p.id_naleznosci = n.id

Ale wciąż nie wiem w jaki sposób zbudować tak rozbudowane zapytanie jak potrzebuję.

 

Edit: Udało mi się skonstruować coś takiego. Spełnia to działanie. Jest dwukrotnie szybsze od poprzedniego, ale wciąż jest dla mnie czarną magia. Wygląda ok? Czy warto coś poprawić?

SELECT n.* 
FROM  `naleznosci` n
INNER JOIN  `platnosci` p ON p.id_naleznosci = n.id
INNER JOIN  `uslugi` u ON u.id = n.id_uslugi
INNER JOIN  `klienci` k ON k.id = u.id_klienta
WHERE id_agenta =  '15'
AND data_wplaty <= termin_platnosci

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Sprawdź czas z tym:

 

SELECT n.* 
FROM  naleznosci n, platnosci p, uslugi u, klienci k
WHERE n.id_agenta =  '15'
AND p.id_naleznosci = n.id
AND u.id = n.id_uslugi
AND k.id = u.id_klienta
AND data_wplaty <= termin_platnosci

 

Czasem tak jest szybciej JOINa.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Moje wykonuje się 0-30ms. Twoje 1-4ms, do tego jest czytelniejsze (dla mnie).

Sweet! W ten sposób będę teraz budował zapytania!

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Na studiach kiedyś połowę zajęć poświęciliśmy własnie na to, że się licytowałem z facetem co do tej wersji. Nie zawsze jest lepsza, ale o dziwo często była szybsza. Co do Joinów to warto korzystać, jak chcesz LEFT JOINa, czyli przypadek, że rekord w złączanej tabeli nie musi istnieć - to co ja podalem zastąpi jedynie INNER JOINa.

Udostępnij tego posta


Odnośnik do posta
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się tutaj.

Zaloguj się tutaj

  • Przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników, przeglądających tę stronę.

×