Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Pomoc w zapytaniu do bazy.
Forum PHP.pl > Forum > Bazy danych > MySQL
BigBenek
Witam Forumowiczów.

Z uwagi, że nie jestem "bazodanowcem", a administratorem sieci, zwracam się do Was o pomoc.

Mam tabelę "projekty". Tabela zawiera id i id klienta.
Mam również 5 tabel w której trzymam umowy powiązane z projektami.
Tabele umów zawierają między innymi id projektu i pole "zapłacono".

Potrzebuję zadać bazie pytanie, które poda mi id projektu, w którym znajdują się umowy, które mają "status" niezapłacone (pole 'zaplacone' w tabeli umów ma wartość 0 dla nie i wartość 1 dla tak).

Przeguglałem trochę, jednak nie wiem, o co pytać.
Moje tymczasowe query do bazy, które zwraca dobry wynik dla jednej tabeli umów wygląda tak:

  1. SELECT projekty.id, projekty.userid, faktura.projectid, dzwiekfaktura.zaplacono WHERE faktura.projectid=projekty.id AND faktura.zaplacono='0';


Na tej podstawie wymyśliłem zapytanie:

  1. SELECT projekty.id, projekty.userid, dzwiekfaktura.projectid, dzwiekfaktura.zaplacono, dzwiekumowa.projectid, dzwiekumowa.zaplacono, obrazekfaktura.projectid, obrazekfaktura.zaplacono, obrazekumowa.projectid, bankmuzyki.projectid, bankmuzyki.zaplacono FROM projekty, dzwiekfaktura, dzwiekumowa, obrazekfaktura, obrazekumowa, bankmuzyki WHERE dzwiekfaktura.projectid=projekty.id AND dzwiekfaktura.zaplacono='0' OR dzwiekumowa.projectid=projekty.id AND dzwiekumowa.zaplacono='0' OR obrazekfaktura.projectid=projekty.id AND obrazekfaktura.zaplacono='0' OR obrazekumowa.projectid=projekty.id AND obrazekumowa.zaplacono='0' OR bankmuzyki.projectid=projekty.id AND bankmuzyki.zaplacono='0';


Niestety, zwraca również projekty, w których znajdują się zapłacone (1) umowy.

Proszę o pomoc w wygenerowaniu właściwego zapytania.

Dziękuję i pozdrawiam.

mortus
Oj, chyba ta baza danych jest konkretnie skopana. Jak wyglądają poszczególne tabele i dlaczego masz taki dziwny podział np. dzwiekfaktura, dzwiekumowa?
sazian
po pierwsze lepiej używać złączeń
czyli np.
  1. SELECT * FROM tab1
  2. JOIN tab2 ON tab1.id=tab2.kolumna1

po drugie na klawiaturze masz taki klawisz ja enter, używaj go czasem tongue.gif

po trzecie pogrupuj warunki logiczne nawiasami
TRUE && TRUE || TRUE && FALSE == FALSE
(TRUE && TRUE) || (TRUE && FALSE) == TRUE
niby to sano, a wynik inny
BigBenek
Witam.

Możliwe, że baza i struktura jest "skopana", nie mniej jednak jak do tej pory spełnia swoją rolę.
Prędkość jej działania to ostatni element, którym się zainteresuję, a raczej nie będę musiał tego robić (jak na możliwości MySQla niewiele rekordów i bardzo mało użytkowników).

Dzisiaj udało mi się stworzyć zapytanie, które całkowicie rozwiązuje mój problem:

  1. SELECT id FROM `projekty`
  2. WHERE
  3. id IN ( SELECT projectid FROM bankmuzyki WHERE `zaplacono`='0')
  4. OR
  5. id IN ( SELECT projectid FROM dzwiekfaktura WHERE `zaplacono`='0')
  6. OR
  7. id IN ( SELECT projectid FROM dzwiekumowa WHERE `zaplacono`='0')
  8. OR
  9. id IN ( SELECT projectid FROM obrazekfaktura WHERE `zaplacono`='0')
  10. OR
  11. id IN ( SELECT projectid FROM obrazekumowa WHERE `zaplacono`='0');


Dziękuję za sugestie, mam również nadzieję, że "enter" jest częściej używany smile.gif

Pozdrawiam.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.