Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: trudne zapytanie do sql
Forum PHP.pl > Forum > Bazy danych > MySQL
pbanasiak
mam tabelę o dwóch polach - userid i time
wpisy dla userid mogą się dublować, czyli dla tego samego userid może być kilka wartości time
i potrzebuję wyciągnąć userid dla którego time jest najmniejszy ze wszystich nawiększych poplątałem więc dam przykład:
mam takie wpisy
userid time
1 4554121215
2 5454242242
1 4542424242
1 4543543543
3 5435434354
3 4354354548
wyciągam największe time dla każdego userid:
1 4554121215
2 5454242242
3 5435434354
i teraz potrzebuję wyciągnąc userid w kolejności gdzie time jest najmnijeszy czyli:
1
3
2


da się to zrobić w jednym zapytaniu?
nospor
spróbuj tak. pisze z palca, ale chyba bedzie dobrze:
  1. SELECT userid, max(time) maxtime
  2. FROM tabela GROUP BY userid
  3. HAVING time = min(maxtime)
pbanasiak
MySQL zwrócił komunikat:

#1054 - Unknown column 'time' in 'having clause'
nospor
a masz taką kolumnę time?
edit: aa sorki:
  1. SELECT userid, max(time) maxtime
  2. FROM tabela GROUP BY userid
  3. HAVING maxtime = min(maxtime)
SongoQ
Chyba pluje sie ze nie mozna uzyc aliasu w having.
Sprawdz takie cos

  1. SELECT userid, max(time) maxtime
  2. FROM tabela GROUP BY userid
  3. HAVING time = min(max(time))
nospor
@SongoQ raczej mu chodzi o to, że musi byc wlasnie alias grupowania smile.gif
  1. SELECT userid, max(time) maxtime
  2. FROM tabela GROUP BY userid
  3. HAVING maxtime = min(maxtime)
pbanasiak
nospor:

MySQL zwrócił komunikat:

#1054 - Unknown column 'maxtime' in 'having clause'

SongoQ:

MySQL zwrócił komunikat:

#1054 - Unknown column 'time' in 'having clause'


to może inaczej:
tabela w pełni wygląda tak:

  1. id bigint(20) Nie AUTO_INCREMENT
  2. url text Tak NULL
  3. userid bigint(20) Tak NULL
  4. active int(1) Tak NULL
  5. approved int(1) Tak NULL
  6. odslon bigint(20) Tak NULL
  7. time bigint(20) Tak NULL
  8. admin int(1) Nie 0

aktualnie zapytanie wyglda tak:
  1. $result = mysql_query("SELECT `uslugi_autosurf_strony`.`id`, `uslugi_autosurf_strony`.`userid`, `uslugi_autosurf_strony`.`url`, `uslugi_autosurf_credits`.`credit`
  2. FROM `uslugi_autosurf_strony`, `uslugi_autosurf_credits` WHERE `uslugi_autosurf_strony`.`userid` = `uslugi_autosurf_credits`.`userid` AND `uslugi_autosurf_strony`.`admin` = 0 AND `uslugi_autosurf_strony`.`approved` = 1 AND `uslugi_autosurf_strony`.`active` = 1 AND `uslugi_autosurf_credits`.`credit` >= 1 AND `uslugi_autosurf_strony`.`userid` != $_SESSION[userid] order by `uslugi_autosurf_strony`.`time`");
  3. while($rezul = mysql_fetch_array($result)) {
  4. $rezul2 = mysql_fetch_array(mysql_query("SELECT count(*)
  5. FROM `uslugi_autosurf_strony_rezerwacja` WHERE `userid` = $rezul[userid]"));
  6. IF($rezul["credit"]-$rezul2[0] < 1) continue;
  7. //tutaj wyświetlenie strony
  8. exit;
  9. }

jest to kod do skryptu autosurfu i problem w tym, że jak ktoś doda 10 stron a ktoś tylko 1 to ten z 10 otzrymuje odsłony 10 razy częściej i osoby, które mają po kilkadziesiąt stron zapychają ten autosurf i chodzi mi teraz jak to zmodyfikować aby kązdy otzrymywał tyle samo odsłon bez względu na to ile ma stron

i dobrze by było gdyby dwa zapytania które podałem powyżej połączyć w jedno
SongoQ
@pbanasiak chyba tak nie przejdzie, mozesz troszeczke w inny sposob zrobic.

  1. SELECT userid, max(time) maxtime
  2. FROM tabela GROUP BY userid
  3. ORDER BY maxtime


I jesli chesz najmniejszy zwrocic to wtedy limit. Zapytanie nie jest wydajne ale moze Ci problem rozwiazac.
ktuvok
Chcesz wyciągnąć najmniejszy czy największy time?

Może wystarczy taka konstrukcja zapytania:
  1. SELECT userid, MAX(time) AS MaxTime
  2. FROM Tabela GROUP BY userid
  3. ORDER BY MaxTime DESC

Swoją drogą stosowanie nazwy "time" dla pola tabeli nie wydaje mi się dobrym pomysłem smile.gif

Pozdrawiam,
K
pbanasiak
dobra już sobie sam poradziłem
dag
Cytat(pbanasiak @ 2005-06-24 10:52:40)
dobra już sobie sam poradziłem

Skoro już sobie sam poradziłeś to mógłbyś podać rozwiązanie dla potomnych..
pbanasiak
to znaczy nie z tym zapytaniem tylko przebudowałem strukturę bazy i już tego nie potrzebuję
SongoQ
Najprosciej to mozna rozwiazac w taki sposb jak napisalem, czyli agregacia i sortowanie po tym polu. Mozna tez kompinowa z podselektami i osiagnie sie co proponowal @nospor.
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.