Jak uwarunkować zapytanie główne od podzapytania ?

0

Mam tabele takie:

Tabela z zamowieniami

id id client
2 4
Tabela z pozycjami zamowienia
id id zamowienia status
1 2 1
2 2 1
3 2 2
4 2 2
5 2 2
Trzebuje teraz takie zapytanie dać by wyświetlić zamowienia tylko wtedy jesli jakakolwiek pozycja zamowienia ma status = 1
Jesli wszystkie statusy z pozycjami zamowienia sa inne niz 1 to ma nie poakzywac tego zamowienia na liscie. Jak to zapytanie
wykonac ?
0

Czystym SQLem raczej tak nie zrobisz. Zresztą to byłaby bardzo dziwna operacja.

@tk mnie się jednak wydaje że on by chciał żeby:

  • jeśli którakolwiek pozycja zamówienia o danym ID ma status 1 to wyświetlasz WSZYSTKIE pozycje zamówienia
  • jesli nie to nie wyświetlasz nic
    ;]
    Chyba że chodzi mu o samo wyświetlenie ID zamówień które mają pozycję z 1, ale wtedy napisał to niejasno.
0

Zainteresuj sie czyms takim jak zlaczenia tabel (join). Twoj problem mozna rozwiazac mniej wiecej tak:

SELECT z.id, z.id_client 
FROM zamowienia z
INNER JOIN pozycje_zamowien pz ON pz.id_zamowienia=z.id
WHERE pz.STATUS=1

To oczywiscie tylko pewna koncepcja. Nie wiem jak dokladnie nazywaja sie u Ciebie tabele i uzylem podkreslnika w polach gdzie masz spacje. Nie sprawdzalem tez czy dziala poprawnie.

0

Może sprecyzuje to jakos
Chce mieć liste zamówień tylko lista zamowien bez wysweitlania pozycji
Czyli mam w bazie 5 zamowien

Zamowienia

id name
1 zam 1
2 zam 2
3 zam 3
4 zam 4
5 zam 5

Teraz w pozycjach zamowienia mam tak

Pozycje

ID ID Zamowienia status
1 1 1
2 1 2
3 2 2
4 2 2
5 3 1
6 3 1

I teraz zaytanie chcialbym by zwrociło

ID name
1 zam 1
3 zam 3

Select zamowienia gdzie jakakolwiek pozycja w tym zamowieniu ma status 1 wtedy wysweitl na liscie to zamowienie

A gdy bede mial juz liste to po klikniciu na nia pobiore sobie odpowiednio rekordy te ze statusem 1 ale nie trzebuje
ich pobierac od razu w tym pierwszym zapytaniu. Ale nie wiem jak to ogarnac :(

1
SELECT z.id, z.name
FROM pozycje p
JOIN zamowienia z ON (p.id_zamowienia = z.id)
WHERE p.status = 1
GROUP BY z.id, z.name

?

plusem tego jest że dorzucając COUNT(*) do listy zwracanych kolumn otrzymasz od razu ilość pozycji ze statusem 2 w tym zamówieniu

1

Zrobilem sobie tabele wzorujac sie na Twoim opisie. W Postgresie takie zapytanie:

 
select distinct z.id, z.name from "Zamowienia" z
inner join "Pozycje" zp on z.id=zp.id_zamowienia
where zp.status=1

Daje mi dokladnie taki wynik jaki oczekujesz. Jezeli nie o to dokladnie chodzilo, to napisz. Podaj tez dialekt, bo to co dziala w Postgresie moze nie dzialac w MySQLu itp.

0
select zamowienia.id from zamowienia where zamowienia.id in(
  select pozycje.id from pozycje where pozycje.status = 1
) group by zamowienia.id

Brzydkie ale powinno śmigać. Ale musi dac sie ładniej.
@tk widzę że miałes mniej więcej podobny pomysł :)

poprawienie znacznika <code class="sql"> - fp

0

Dziekuje za pomoc, zadzialalo z distinctem tak jak powinno. Przynajmniej na razie dziala ale jutro do tego wroce bo dzis juz padam , dziekuje jeszcze raz :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1