Threef Opublikowano 25 Marca 2014 Udostępnij Opublikowano 25 Marca 2014 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 Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 25 Marca 2014 Administratorzy Udostępnij Opublikowano 25 Marca 2014 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 Więcej opcji udostępniania...
Threef Opublikowano 26 Marca 2014 Autor Udostępnij Opublikowano 26 Marca 2014 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 Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 26 Marca 2014 Administratorzy Udostępnij Opublikowano 26 Marca 2014 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 Więcej opcji udostępniania...
Threef Opublikowano 26 Marca 2014 Autor Udostępnij Opublikowano 26 Marca 2014 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 Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 26 Marca 2014 Administratorzy Udostępnij Opublikowano 26 Marca 2014 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 Więcej opcji udostępniania...
Threef Opublikowano 26 Marca 2014 Autor Udostępnij Opublikowano 26 Marca 2014 Moje wykonuje się 0-30ms. Twoje 1-4ms, do tego jest czytelniejsze (dla mnie). Sweet! W ten sposób będę teraz budował zapytania! Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 26 Marca 2014 Administratorzy Udostępnij Opublikowano 26 Marca 2014 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 Więcej opcji udostępniania...
Rekomendowane odpowiedzi
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ę