Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> zapytanie w MySQL, nie wiem jajk bliżej okreslić
bpawlik
post
Post #1





Grupa: Zarejestrowani
Postów: 40
Pomógł: 0
Dołączył: 13.01.2005

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


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
DeyV
post
Post #2





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




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;
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: 1.10.2025 - 13:48