Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]Rekord z największą wartością w danym polu
Forum PHP.pl > Forum > Przedszkole
foxbond
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
kadlub
  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
sadistic_son
  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
foxbond
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
Valdi_B
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.
foxbond
Wielkie dzięki za pomoc!

Musiałem dać jedną poprawkę i wszystko śmiga 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 )
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.