Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> trudne zapytanie do sql
pbanasiak
post
Post #1





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 3.04.2004

Ostrzeżenie: (0%)
-----


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?
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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)


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
pbanasiak
post
Post #3





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 3.04.2004

Ostrzeżenie: (0%)
-----


MySQL zwrócił komunikat:

#1054 - Unknown column 'time' in 'having clause'
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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)


Ten post edytował nospor 23.06.2005, 11:37:38


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
SongoQ
post
Post #5





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


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))


--------------------
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




@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)


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
pbanasiak
post
Post #7





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 3.04.2004

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
SongoQ
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


@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.

Ten post edytował SongoQ 23.06.2005, 12:28:24


--------------------
Go to the top of the page
+Quote Post
ktuvok
post
Post #9





Grupa: Zarejestrowani
Postów: 243
Pomógł: 0
Dołączył: 30.11.2003

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
pbanasiak
post
Post #10





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 3.04.2004

Ostrzeżenie: (0%)
-----


dobra już sobie sam poradziłem
Go to the top of the page
+Quote Post
dag
post
Post #11





Grupa: Zarejestrowani
Postów: 180
Pomógł: 0
Dołączył: 24.12.2003

Ostrzeżenie: (0%)
-----


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..


--------------------

------------------------------------------------------------------------------------------------------
Go to the top of the page
+Quote Post
pbanasiak
post
Post #12





Grupa: Zarejestrowani
Postów: 69
Pomógł: 0
Dołączył: 3.04.2004

Ostrzeżenie: (0%)
-----


to znaczy nie z tym zapytaniem tylko przebudowałem strukturę bazy i już tego nie potrzebuję
Go to the top of the page
+Quote Post
SongoQ
post
Post #13





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


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.


--------------------
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 20:53