Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: zapytanie w MySQL
Forum PHP.pl > Forum > Bazy danych > MySQL
bpawlik
Witam

Mam tabelę o strukturze:
Kod
wersja | x | y | klucz
1      | a | a | 111
1      | b | b | 222
2      | c | c | 111
2      | d | d | 222
3      | e | e | 111

w bazie przechowywane są pary wartości (x i y) dla odpowiednich elementów identyfikowanych przez kolumnę klucz. Wartości te mogą się jednak zmieniać co obrazuje kolumna wersja np. element o kluczu 111 ma trzy wersje (1,2 i 3). Chodzi o by w możliwie optymalnym zapytaniu zwrócić wszystkie elementy o najnowszych wersjach, np.
Kod
wersja | x | y | klucz
2      | d | d | 222
3      | e | e | 111


Czy da się coś takiego wykonać jednym zapytaniem? Bez obrabiania wyniku w php?
rafcio8405
Nie wiem czy pomoże ale:
  1. SELECT `klucz`, `wersja`, `x`, `y`
  2. FROM `jakas_tabela` WHERE `klucz`='111' AND `wersja`<'9' AND `wersja`>'5'


albo

  1. SELECT `klucz`, `wersja`, `x`, `y`
  2. FROM `jakas_tabela` WHERE `klucz`='111' ORDER BY `wersja` DESC LIMIT 5


Polecam ten drugi przykład, który pokazuje 5 rekordów posortowanych od największego do najmniejszego.
SongoQ
Cytat
Chodzi o by w możliwie optymalnym zapytaniu zwrócić wszystkie elementy o najnowszych wersjach, np.


Musisz date wstawic bo skad bedziesz wiedzial ktory jest nowszy, zadnego id nie masz ani daty to jak chesz sortowac?
bpawlik
Cytat(SongoQ @ 2005-06-07 07:12:23)
Musisz date wstawic bo skad bedziesz wiedzial ktory jest nowszy, zadnego id nie masz ani daty to jak chesz sortowac?

Najnowszy jest ten z największym numerem wersji, oczywiście.
SongoQ
Czyli co nie masz nigdzie klucza podstawowego?
bpawlik
Oczywiście, ze mam i mam jeszcze z 15 pól w tej tabeli, ale przedstawiłem tylko to co najważniejsze, poza tym id nie jest IMO w tym przypadku istotne. A kolumna "klucz" w tym przykładzie to akurat klucz obcy.

Prościej nie potrafię smile.gif
DeyV
Niestety - jest to problem bardzo trudny do rozwiązania w MySQL, przynajmniej w wersjach nie obsługujących subzapytań, i gdy nie chcemy wykorzystywać tabel tymczasowych.

Tak naprawdę jest to bowiem problem źle zaprojektowanej struktury - dane te powinny być przechowywane w kilku tabelach.

Ale jest to problem ... możliwy do rozwiązania. Więcej na ten temat:
http://dev.mysql.com/doc/mysql/en/example-...-group-row.html


W tym przypadku mogłoby to wyglądać tak:
  1. SELECT
  2. SUBSTRING( MAX( CONCAT( LPAD( wersja ,3,'0'), klucz) ), 4) AS klucz ,
  3. 0+LEFT( MAX( CONCAT( LPAD( wersja ,3,'0'), klucz) ), 3) AS wersja,
  4. RIGHT( MAX( CONCAT( LPAD( wersja ,3,'0'), z ) ), 1 ) AS z,
  5. RIGHT( MAX( CONCAT( LPAD( wersja ,3,'0'), y ) ), 1) AS y
  6. FROM `max_concat` GROUP BY max_concat.klucz;
bpawlik
Dzieki,
będę próbował, przecież nie ma rzeczy niemożliwych (chyba smile.gif )
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.