Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] Pobieranie rekordów wraz z najwyższą wartością z innej tabeli
Forum PHP.pl > Forum > Przedszkole
The Night Shadow
Zapytanie pobiera z bazy danych wszystkie rekordy spełniające określone warunki. Każdy rekord ma swój indywidualny numer ID.

Przykłąd:

Tabela: X
Kolumny: X.id, X.nazwa

Tabela: Y
Kolumny Y.id, Y.id_x, Y.ilosc, Y.data

W jaki sposób pobrać w jednym zapytaniu wszystkie rekordy z tabeli X, a zarazem dołączyć do każdego maksymalną ilosc z tabeli Y, oraz ogólną ilość rekordów przyporządkowanych z tabeli Y d tego rekordu?

Mogę to zrobić na piechotę w dwóch zapytaniach, ale zależy mi na sortowaniu...

Zastanawiam się, czy to w ogóle jest możliwe...
babejsza
Nie wiem czy chodzi Ci o takie rozwiązanie, ale tak zrozumiałem Twoje pytanie:

  1. SELECT *, (SELECT SUM(ilosc) FROM Y WHERE Y.id_x = X.id) AS suma FROM X ORDER BY suma
The Night Shadow
Coś w tym stylu... dzięki wielki smile.gif


Mam jednak jeszcze jedno pytanie. Czy istnieje możliwość, by podczas sortowania puste rekordy wędrowały na koniec? Powiedzmy, że sortujemy według pola kwota rosnąco lub malejąco i powinno być tak

id kwota

1 12
2 13
4 2345
3 22345
10
12
42

A nie tak:

10
12
42
2 13
4 2345
3 22345
href
Kod
SELECT *, (SELECT SUM(ilosc) FROM Y WHERE Y.id_x = X.id) AS suma FROM X WHERE suma IS NOT NULL ORDER BY suma UNION SELECT *, suma  FROM X WHERE suma IS NULL;


mozna tez wywalic puste wyniki:
Kod
SELECT *, (SELECT SUM(ilosc) FROM Y WHERE Y.id_x = X.id) AS suma FROM X WHERE suma IS NOT NULL ORDER BY suma;
The Night Shadow
  1. (SELECT aukcje_aukcje.*,
  2.  
  3. (SELECT users_login FROM aukcje_users WHERE users_id = aukcje_maksymalna
  4. LIMIT 1) AS maksymalna
  5.  
  6. FROM aukcje_aukcje WHERE aukcje_id_user = '16' AND aukcje_rozpoczecie_data < '1177951380' AND aukcje_czas_data > '1177951380' AND aukcje_zakonczona = '0' AND EXISTS (SELECT *
  7. FROM aukcje_users WHERE users_id = aukcje_maksymalna)
  8.  
  9. ORDER BY maksymalna ASC, aukcje_czas_data)
  10.  
  11. UNION
  12. (SELECT aukcje_aukcje.*,
  13.  
  14. (SELECT users_login FROM aukcje_users WHERE users_id = aukcje_maksymalna
  15. LIMIT 1) AS maksymalna
  16.  
  17. FROM aukcje_aukcje WHERE aukcje_id_user = '16' AND aukcje_rozpoczecie_data < '1177951380' AND aukcje_czas_data > '1177951380' AND aukcje_zakonczona = '0' AND NOT EXISTS (SELECT *
  18. FROM aukcje_users WHERE users_id = aukcje_maksymalna)
  19. ORDER BY aukcje_czas_data)
  20.  
  21. LIMIT 0, 50


Nad powyższym zapytaniem siedzę już od kilku godzin. Dane pobierane są w sposób jak najbardziej poprawny. Problemem jest jedynie sortiwanie. W momencie kiedy nie ma drugiego zapytania i UNION dane sortują się poprawnie według pola "maksymalna".

W momencie kiedy pojawia się drugie zapytanie coś jest nie tak. Dane są pobierane, ale nie są sortowane. W całym zapytaniu dane z pierwszej jego części pownny się sortować według pola. Nie sortują się.

Co jest nie tak? Już dostaję mętliku w gowie. Pierwsza część zostawiona sama jest ok sortuje się pięknie. Kiedy dorzucić UNION i resztę coś się wali, jakby blokowane było sortowanie w obrębie pierwszego zapytania.

Co z tym zrobić?
Kicok
http://dev.mysql.com/doc/refman/5.0/en/union.html - pisze tam co nieco o ORDER BY
The Night Shadow
LIMIT dodany do każdego zapytania indywidualnie i działa bezbłędnie... jednak tak na chłopski rozum jest to bezsensowne utrudnienie...

dzięki za pomoc! smile.gif
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.