Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL]Rekord z największą wartością w danym polu
foxbond
post
Post #1





Grupa: Zarejestrowani
Postów: 162
Pomógł: 12
Dołączył: 20.12.2009
Skąd: Siedlce

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


Przedstawię to na przykładach aby było nieco szybciej


Kod
tabela cars :
id | owner_id | vmax | [...]

|8|9|120.00
|188|9|280.00
|113|9|187.20
|187|9|190.00
|140|51|355.96
|152|51|310.00


tabela users :
id | active_car_id | [...]

9   | 113
51 | 152


Chodzi mi o uzyskanie 'id' z tabeli 'cars' gdzie 'owner_id'=users.id i vmax jest największe
Rozwiązanie może być także po stronie php

  1. SELECT cars.id AS cid, vmax, users.id AS uid FROM cars, users WHERE owner_id=users.id && (vmax jest największy)


potem chcę to wrzucić w pętlę i zrobić tak:
  1. UPDATE users SET active_car_id='.$x['cid'].' WHERE id='.$x['uid'].'



Z góry dzięki za pomoc!

P.S. Rozwiązanie nie musi być optymalne, odpalę taki skrypt może raz na miesiąc, a do przerobienia ma tylko ~600 rekordów

Ten post edytował foxbond 23.03.2011, 10:14:48
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
kadlub
post
Post #2





Grupa: Zarejestrowani
Postów: 548
Pomógł: 105
Dołączył: 4.06.2010

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


  1. $query = "select cars.id from cars,users where cars.vmax=(select max(vmax) from cars) and cars.owner_id=users.id";


sprwadź czy zadziała bo szybko pisałem
Go to the top of the page
+Quote Post
sadistic_son
post
Post #3





Grupa: Zarejestrowani
Postów: 1 495
Pomógł: 245
Dołączył: 1.07.2009
Skąd: Bydgoszcz

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


  1. SELECT cars.id AS cid, MAX(cars.vmax), users.id AS uid FROM cars, users WHERE cars.owner_id=users.id
LUB:
  1. SELECT cars.id AS cid, cars.vmax, users.id AS uid FROM cars, users WHERE cars.owner_id=users.id ORDER BY cars.vmax DESC LIMIT 1


Ten post edytował sadistic_son 23.03.2011, 11:24:45
Go to the top of the page
+Quote Post
foxbond
post
Post #4





Grupa: Zarejestrowani
Postów: 162
Pomógł: 12
Dołączył: 20.12.2009
Skąd: Siedlce

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


Ani jedno, ani drugie nie działa.
Spróbuję trochę dokładniej opisać.

Pierwsze zapytanie powinno zwrócić:
Kod
cid | vmax | uid

188 | 280 | 9
140 | 355.96 | 51
itd. dla następnych graczy


i potem w pętli robię tak:
  1. while($x = $db->fetch_array($query))
  2. {
  3. $db->query('UPDATE {[table]} SET active_car_id='.$x['cid'].' WHERE id='.$x['uid'], 'users');
  4. }



Proszę moderatora o przeniesienie tematu do działu bazy danych->mysql
Z góry dzięki

Ten post edytował foxbond 23.03.2011, 20:15:57
Go to the top of the page
+Quote Post
Valdi_B
post
Post #5





Grupa: Zarejestrowani
Postów: 107
Pomógł: 30
Dołączył: 19.02.2011
Skąd: Warszawa

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


Ponieważ sprawa (chyba) wykracza poza poziom przedszkola, podam rozwiązanie "etapowo" i z objaśnieniem:

Etap 1: Jak wyciągnąć rekordy najszybszych samochodów poszczególnych graczy (na razie pełne):
  1. SELECT * FROM cars AS c1
  2. WHERE NOT EXISTS
  3. ( SELECT * FROM cars AS c2
  4. WHERE c2.owner_id = c1.owner_id AND c2.vmax > c1.vmax )
Ciągniemy z "cars" te rekordy, dla których nie ma rekordu o takim samym owner_id i większej vmax.
Ta kwerenda (nieco zmieniona) będzie "środkiem" finalnego rozwiązania.

Etap 2 (finalny):
Danymi z powyższej kwerendy trzeba update'ować tabelę users:
  1. UPDATE users SET active_car_id =
  2. ( SELECT id FROM cars AS c1
  3. WHERE c1.owner_id = users.id
  4. AND NOT EXISTS
  5. ( SELECT * FROM cars AS c2
  6. WHERE c2.owner_id = c1.owner_id AND c2.vmax > c1.vmax )
  7. )
Zwróć uwagę na 2 zmiany w zagnieżdżonej kwerendzie:
1. Po SELECT zamiast "*" jest "id", bo tą wartość trzeba wpisać do pola active_car_id (a nie cały rekord).
2. We frazie WHERE doszedł warunek "c1.owner_id = users.id" bo z wyniku zagnieżdżonej kwerendy trzeba dobrać (tylko 1) rekord dla danego user.id.

W efekcie wszystko robisz jedną kwerendą, bez bawienia się w pętle w PHP.


Ten post edytował Valdi_B 23.03.2011, 23:39:58
Go to the top of the page
+Quote Post
foxbond
post
Post #6





Grupa: Zarejestrowani
Postów: 162
Pomógł: 12
Dołączył: 20.12.2009
Skąd: Siedlce

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


Wielkie dzięki za pomoc!

Musiałem dać jedną poprawkę i wszystko śmiga (IMG:style_emoticons/default/guitar.gif)
  1. UPDATE s1_users SET active_car_id =
  2. ( SELECT id FROM s1_users_cars AS c1
  3. WHERE c1.owner_id = s1_users.id
  4. AND NOT EXISTS
  5. ( SELECT * FROM s1_users_cars AS c2
  6. WHERE c2.owner_id = c1.owner_id AND c2.vmax > c1.vmax ) LIMIT 1
  7. )

( LIMIT 1 )

Ten post edytował foxbond 24.03.2011, 16:31:20
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 08:37