Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Sortowanie przed grupowaniem, jedno zapytanie?
Mariuszeq
post 29.03.2009, 19:03:24
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 29.03.2009

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


Mam następującą tabelę `tabela` (ENGINE=MEMORY) z kolumnami:
nazwa [char(40)] | id_usera [int] | adres_ip [char(15)] | data_czas_logowania [int(11)]
z danymi:
aaa | 1 | 127.0.0.1 | 100
aaa | 2 | 127.0.0.1 | 110
aaa | 3 | 127.0.0.1 | 120
aaa | 2 | 127.0.0.1 | 130
aaa | 1 | 127.0.0.2 | 140
aaa | 3 | 127.0.0.2 | 150
aaa | 1 | 127.0.0.2 | 160
bbb | 2 | 127.0.0.2 | 160

Napisałem też następujące zapytanie:
  1. SELECT `adres_ip`, `id_usera`,
  2. COUNT(`id_usera`) FROM `tabela` WHERE `nazwa` = 'aaa' AND NOT `id_usera` = '2'
  3. GROUP BY `id_usera`


Jako wynik zapytania otrzymuję tablicę:
[0] => 127.0.0.1 [1] => 1 [2] => 3
[0] => 127.0.0.1 [1] => 3 [2] => 2

Potrzebuję zmodyfikować to zapytanie w taki sposób, żeby w wyniku zamiast IP z pierwszego znalezionego rekordu było ostatnie IP danego usera. Czy można zrobić to w jednym zapytaniu? Czytałem o sortowaniu przed grupowaniem, jednak nie znalazłem nic, co by zadowoliło mnie pod względem optymalności (docelowo w tabeli będzie kilkanaście tysięcy wpisów).

Uprzejmie proszę o wskazówki. smile.gif
Go to the top of the page
+Quote Post
kefirek
post 29.03.2009, 19:21:32
Post #2





Grupa: Zarejestrowani
Postów: 781
Pomógł: 256
Dołączył: 29.06.2008

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


A cos takiego ?

  1. SELECT id_usera, (SELECT adres_ip FROM tabela WHERE nazwa = aaa AND NOT id_usera = '2' ORDER BY id_usera DESC LIMIT 1 ),
  2. COUNT(id_usera) FROM tabela WHERE nazwa = aaa AND NOT id_usera = '2'
  3. GROUP BY id_usera


Ten post edytował kefirek 29.03.2009, 19:26:16
Go to the top of the page
+Quote Post
Mariuszeq
post 29.03.2009, 20:20:28
Post #3





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 29.03.2009

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


Wielkie dzięki, troszkę zmodyfikowałem i uzyskałem to, o co mi chodziło:

  1. SELECT `id_usera` AS `id`, (SELECT `adres_ip` FROM `tabela` WHERE `nazwa` = 'aaa' AND `id_usera` = `id`
  2. ORDER BY `data_czas_logowania` DESC LIMIT 1 ), COUNT(`id_usera`)
  3. FROM `tabela` WHERE `nazwa` = 'aaa' AND NOT `id_usera` = '2'
  4. GROUP BY `id_usera`


Mam jeszcze jedno pytanie. Czy podzapytanie wykona się po grupowaniu, czyli w tym przypadku tylko 2 razy?

Edit:
Czy nie lepiej (pod kątem wydajności) byłoby pobrać wszystkie pasujące rekordy:
  1. SELECT `id_usera`, `adres_ip` FROM `tabela` WHERE `nazwa` = 'aaa' AND NOT `id_usera` = '2'

i zliczanie oraz ustalanie ostatniego IP przerzucić na PHP?

Ten post edytował Mariuszeq 30.03.2009, 01:58:46
Go to the top of the page
+Quote Post
StevDefs
post 25.08.2019, 04:53:28
Post #4





Grupa: Zarejestrowani
Postów: 51
Pomógł: 0
Dołączył: 22.08.2019

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


Cialis Vente Libre Espagne cialis vs viagra Amoxicillin Clavulanic Dose For Pig Generic Viagra Overnite No Perscription

3 Dollars Viagra cialis Kamagra Fast London

On Line Pharmacy'S buy viagra Definir Priligy

Mail Order Medicine Canadian Drugs No Prescription Levitra Dosaggio Essere viagra Viagra 2 Day Delivery Preisvergleich Cialis 20 Mg 12

Vente Viagra France Pas Cher cialis online Propecia Malaga Prix Propecia Pas Cher
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 Wersja Lo-Fi Aktualny czas: 17.10.2019 - 22:13