Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: 10 najszybszych sprzedawców
Forum PHP.pl > Forum > Bazy danych > MySQL
zordon
Witam,
mam problem z ułożeniem zapytania.

Upraszczając problem jak się da:
Mam tabelę klienci, z polami id_klienta, id_sprzedawcy, data_rejestracji

Potrzeba mi zapytanie, które wyciągnie 10 sprzedawców , którzy NAJSZYBCIEJ zarejestrowali 50 klientów do konkretnej daty (czyli np Józek ma 50 klientów, ale 1 zarejestrował we środę, a liczymy do wtorku więc się nie kwalifikuje).

Klientów może być więcej niż 50, liczą się najszybciej zarejestrowani (najniższa data_rejestracji)

Głowię się nad tym już chwilę i nie mam pomysłu jak zrobić to na jednym zapytaniu
ylk
hmmm
  1. SELECT id_sprzedawcy FROM klient WHERE COUNT(klient_id)>=50 GROUP BY id_sprzedawcy ORDER BY MAX(data_rejestracji) ASC LIMIT 10

questionmark.gif
Teoretycznie pogrupuje po id_sprzedawcy i dla kazdej grupy wyciagnie date rejestracji ostatniego z klientow i posortuje po niej
zordon
@ylk dobrze kombinujesz, ale Twoje rozwiązanie wykłada się na dokładnie tym samym problemie co wymyślone przeze mnie:
Jeśli sprzedawca A ma 51 zarejestrowanych klientów a sprzedawca B 50 to zapytanie weźmie pod uwagę ten 51 rekord, który już nie powinien się liczyć. Jeśli 50 rekord A < 50 rekord B ale 51 rekord A > 50 rekord B - kolejność będzie nieprawidłowa sad.gif
zegarek84
nie gwarantuję gdyż nie mam danych do sprawdzenia ;p - ale coś w deseń (musisz sobie podmienić LIMIT_DATY - jeszcze zależy w jakim formacie masz datę)

  1. SELECT k1.id_sprzedawcy,
  2. (SELECT ile.data_rejestracji FROM
  3. (SELECT k2.data_rejestracji, count(*) AS ile FROM
  4. klienci AS k2
  5. WHERE k2.id_sprzedawcy = k1.id_sprzedawcy AND k2.data_rejestracji<LIMIT_DATY
  6. ORDER BY k2.data_rejestracji LIMIT 50)
  7. AS ile WHERE ile.ile = 50) AS data_last
  8. FROM klienci AS k1
  9. WHERE data_last IS NOT NULL
  10. ORDER BY data_last
  11. LIMIT 10;
auto-all
A spróbuj czegoś takiego
  1. SELECT id_sprzedawcy AS sprzedawca
  2. FROM klient
  3. GROUP BY id_sprzedawcy
  4. HAVING COUNT(klient_id)>=50
  5. ORDER BY (
  6. SELECT data_rejestracji
  7. FROM klient
  8. WHERE id_sprzedawcy = sprzedawca
  9. ORDER BY data_rejestracji ASC
  10. LIMIT 50 , 1
  11. ) ASC
  12. LIMIT 10
Sortuje wyniki według 50-tej daty w tabeli klient i wybierze tylko sprzedawców którzy zarejestrowali więcej klientów niż 50

Edit...
@zegarek84 dzięki za zwrócenie uwagi na blad
Przeniesienie count() z WHERE do HAVING
zegarek84
Cytat(auto-all @ 15.04.2011, 15:04:24 ) *
Sortuje wyniki według 50-tej daty w tabeli klient i wybierze tylko sprzedawców którzy zarejestrowali więcej klientów niż 50

chyba, że dat rejestracji u danego sprzedawcy będzie poniżej 50 - czasami w niektórych bazach danych null'a potrafi dać u góry wink.gif
[edit] - sorka masz w warunku count więc poprawnie policzy ;]
[edit] - a jednak masz błąd gdyż count jest funkcją agregowalną i warunek powinien znajdować się w HAVING wtedy powinno zadziałać ;]

ale, rzeczywiste ja lekko się zapędziłem, gdyż nie potrzebnie dałem count - można prościej:
  1. SELECT DISTINCT k1.id_sprzedawcy,
  2. (SELECT k2.data_rejestracji FROM
  3. klienci AS k2
  4. WHERE k2.id_sprzedawcy = k1.id_sprzedawcy AND k2.data_rejestracji<LIMIT_DATY
  5. ORDER BY k2.data_rejestracji LIMIT 50, 1) AS data_last
  6. FROM klienci AS k1
  7. WHERE data_last IS NOT NULL
  8. ORDER BY data_last
  9. LIMIT 10;


[EDIT]
dorzuciłem jeszcze DISTINCT przy k1.id_sprzedawcy gdyż ta kolumna wygląda na powtarzalną ;]
zordon
Ostatecznie poradziłem sobie sam (tzn nie znalazłem jeszcze błędów biggrin.gif)
Wasze rozwiązania potestuję i zobaczę, które jest najwydajniejsze (docelowo baza ma mieć kilkadziesiąt tysięcy rekordów, a dla uproszczenia wywaliłem parę rzeczy).

Moje rozwiązanie wygląda PODOBNIE (mogłem walnąć się przy zmianie nazw kolumn, wycinaniu joinów itp - w każdym razie w oryginale działa smile.gif) do:

  1. SELECT count(u.id_klienta) ile, (SELECT u.data_rejestracji FROM users uu WHERE uu.data_rejestracji IS NOT NULL AND uu.id_sprzedawcy = u.id_sprzedawcy ORDER BY uu.data_rejestracji ASC LIMIT 50, 1) ostatni , u.id_sprzedawcy FROM users u GROUP BY u.id_sprzedawcy HAVING ile >= 50 ORDER BY ostatni ASC


Dzięki za zainteresowanie i pomoc!
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.