Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wybranie n wierszy z grupy
Forum PHP.pl > Forum > Bazy danych > MySQL
Pyton_000
Ciemnota opanowała smile.gif

Tabela i dane:
  1. CREATE TABLE `easy_shop_prices` (
  2. `id` INT(11) NOT NULL AUTO_INCREMENT,
  3. `price_type_id` INT(11) NULL DEFAULT NULL,
  4. `article_id` INT(10) UNSIGNED NULL DEFAULT NULL,
  5. `price` DECIMAL(12,2) NULL DEFAULT NULL,
  6. `update_time` INT(11) NULL DEFAULT NULL,
  7. `user_id` INT(11) NULL DEFAULT NULL,
  8. PRIMARY KEY (`id`)
  9. );
  10.  
  11. INSERT INTO `easy_shop_prices` (`id`, `price_type_id`, `article_id`, `price`, `update_time`, `user_id`) VALUES
  12. (254, 1, 177, 150.00, 1410261095, 1);
  13. (255, 2, 177, 130.00, 1410261096, 1),
  14. (256, 3, 177, 100.00, 1410261096, 1),
  15. (257, 1, 177, 2134.00, 1412581952, 1),
  16. (258, 3, 177, 120.00, 1410261093, 1),
  17. (259, 1, 177, 300.00, 1412581952, 1),
  18. (260, 3, 177, 99.00, 1410261096, 1);


Wynik oczekiwany:
Chcę 2 rekordy z każdej grupy (price_type_id) o najwyższym update_time.

Może ogólnie ktoś ma jakieś w miarę uniwersalne rozwiązanie.
redeemer
Może pomoże: http://www.xaprb.com/blog/2006/12/07/how-t...r-group-in-sql/
mmmmmmm
Np. tak: http://sqlfiddle.com/#!2/ed5b2/2
Tak jest prawidłowo - po ANSI-SQL-owemu.
Można też na zmiennych zrobic.
Pyton_000
Po drobnej zmianie śmiga fajnie smile.gif
Potrzebowałem sortowania po update_time a nie price
  1. SELECT * FROM (
  2. SELECT *, (SELECT count(*) FROM `easy_shop_prices` WHERE e.`price_type_id`=`easy_shop_prices`.`price_type_id` AND `easy_shop_prices`.`update_time`>=e.`update_time`) lp FROM `easy_shop_prices` e
  3. ) sub
  4. WHERE lp<=2


Hmm... Jednak nie zadziałało tak jak chciałem.
Danych mam trochę więcej ale w sumie źle że nie podałem bardziej zróżnicowanych.

http://sqlfiddle.com/#!2/81379e/1/0
Dodałem więcej danych.
Docelowo chciałbym z całego setu dostać wynik dla konkretnego produktu np. article_id = 177 przy założeniach jw. czyli 2 ostatnie ceny o najwyższych czasach aktualizacji dla każdej price_type_id

Nie za dużo bym chciał ? smile.gif
nospor
Cytat
Nie za dużo bym chciał ?
Ty zawsze chcesz za duzo wink.gif

  1. SELECT * FROM (
  2. SELECT *, (SELECT count(*) FROM `easy_shop_prices` WHERE easy_shop_prices.article_id = 177 AND e.article_id = 177 AND e.`price_type_id`=`easy_shop_prices`.`price_type_id` AND `easy_shop_prices`.`price`<=e.`price`) lp FROM `easy_shop_prices` e
  3. ) sub
  4. WHERE lp<=2 AND lp>0

Cos takiego?
trueblue
  1. SELECT price_type_id,price,update_time FROM
  2. (SELECT IF(@poprzedni<>price_type_id,@numer:=1,@numer:=@numer+1) AS licznik, @poprzedni:=price_type_id,price_type_id,price,update_time FROM easy_shop_prices,(SELECT @numer:=0,@poprzedni:='') AS init WHERE article_id=177 ORDER BY price_type_id,update_time DESC) AS tmp
  3. WHERE licznik<=2
Pyton_000
nospr co ja poradzę że zachłanny jestem haha.gif
Twoje rozwiązanie nie działa tak jak chciałem ponieważ pobierasz najniższe ceny a mi potrzeba najwyższe czasy dodania (update_time).
Sam też kombinowałem w podobny sposób.

@trueblue Wygląda że Twoje rozwiązanie działa świetnie. smile.gif
nospor
@Pyton ja tylko zmodyfikowalem podane przez ciebie zapytanie w linku. NIe moja wina, ze tam sortowales po cenie a nie czasie.... wystarczy ze to poprawisz i bedzie tak jak ma byc.
Pyton_000
Nie ;P W post wkleiłem zapytanie które "działało" ale dla setu podanego w 1szym poście,
na sqlfiddle podałem rozwiązanie mmmmmmm z dodanym większym setem danych.
smile.gif

Czepiam się ;P
nospor
No i wlasnie pracowalem na sqlfiddle, skoro jego podales jako zbior danych. Uznalem, ze masz tam zapytanie jakie chcesz miec i prosisz o jego rozbudowe. Wystarczy wiec ze zmienisz tam sortowanie na jakie chcesz i bedziesz mial to co chcesz.
Pyton_000
Zmieniając sortowanie nie wypluwa poprawnych wyników.
nospor
Mogę zobaczyc kod po zmianach?
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-2024 Invision Power Services, Inc.