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
Valdi_B
post
Post #2





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

Posty w temacie


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: 2.10.2025 - 15:51