Skocz do zawartości

[SQL] subquery i przekazywanie wartości


Threef

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?

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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 :)

Odnośnik do komentarza
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:

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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 ?

Odnośnik do komentarza
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

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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.

Odnośnik do komentarza
Udostępnij na innych stronach

  • Administratorzy

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.

Odnośnik do komentarza
Udostępnij na innych stronach

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

Jedynie 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ę poniżej.

Zaloguj się
  • Ostatnio przeglądający   0 użytkowników

    • Brak zarejestrowanych użytkowników przeglądających tę stronę.
×
×
  • Dodaj nową pozycję...