Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP]Zaawansowane sortowanie wyników zapytania do bazy
filout
post
Post #1





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 1.06.2012

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


Witam wszystkich

To mój pierwszy post na tym forum, więc proszę o wyrozumiałość (IMG:style_emoticons/default/wink.gif)

Zacznę od początku:

Chcę posortować wyniki zapytania do bazy i tu zaczynają sie schody:
Nie interesuje mnie sortowanie alfabetyczne bo to jest pikuś.
Chciałbym sortować wyniki zapytania według części wartości kolumny wyciągniętej z bazy.
Konkretnie (zeby bylo jasne o co mi chodzi):
interesują mnie 3 kolumny: ikona, tytul i podpis
problem twki w posortowaniu wyników wedlug części tytułu, który ma format: abc [cztery cyfry 0-9] xyz (oczywiście "abc" i "xyz" to tylko przykłady (IMG:style_emoticons/default/wink.gif) )
skrypt ma w pierwszej kolejnośći wyciągnąć zawartość nawiasu klamrowego, a następnie posortować: a. według wartości liczbowej w nawiasie b. alfabetycznie

Próbowałem z bazą danych:
  1. $th0000 = mysql_query("SELECT * FROM temat WHERE tytul LIKE '%[0000]%' ORDER BY tytul ASC");
  2. $th0001 = mysql_query("SELECT * FROM temat WHERE tytul LIKE '%[0001]%' ORDER BY tytul ASC");

niby działa, ale nie interesuje mnie 10k zapytań do bazy (IMG:style_emoticons/default/wink.gif)

spróbowałem, więc wyrażeń regularnych zaczynając od sortowania wg. schematu
i tu poległem (IMG:style_emoticons/default/sad.gif)
Wiem, że coś robię żle, ale sam jeszcze nie wiem co...

kiedy patrzę na ten kod wiem, że coś pominąłem, ale nie wiem jak się do tego zabrać

  1. $th = mysql_query("SELECT * FROM temat");
  2. $tem = mysql_fetch_array($th);
  3. $wzor = '/\\[[0-9]{4}\\]/';
  4.  
  5. while (preg_match($wzor, $temat['tytul']))
  6. {
  7. echo $tem['ikona'], "Tytuł: " $tem['tytul'], " napisał: ", $tem['podpis'], "</br>";
  8. }


pętla while w nieskończoność wywala mi pierwszy napotkany wynik
zastąpienie while instrukcją if daje mi tylko pierwszy wynik z bazy
"taka jest charakterystyka tych instrukcji" - to wiem

w takim razie co mogę zrobić żeby wyświetlało mi wszystkie wyniki zapytania odpowiadające łańcuchowi
mogę się tylko domyślać, że chodzi o nieodpowiednie umiejscowienie pętli w kodzie

jakieś propozycje lub sugestie?

Ten post edytował filout 1.06.2012, 04:44:18
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
IProSoft
post
Post #2





Grupa: Zarejestrowani
Postów: 479
Pomógł: 97
Dołączył: 6.09.2011
Skąd: php.net :)

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


Jeżeli ciąg ma taką formę jak piszesz czyli 3litery - 4cyfry -3 litery możesz zastosować coś na wzór:
Kod
SELECT title, SUBSTRING( `title` , 1, 2 ) AS warunek1, SUBSTRING( `title` , 2, 3 ) AS warunek2
FROM tabela
ORDER BY warunek1, warunek2;


Jeśli nie znasz pozycji możesz dodać:
Kod
LOCATE('[', `title`);

np
Kod
SUBSTRING( `title` , LOCATE('[', `title`), LOCATE(']', `title`) )


Ten post edytował IProSoft 1.06.2012, 09:40:54
Go to the top of the page
+Quote Post
irmidjusz
post
Post #3





Grupa: Zarejestrowani
Postów: 279
Pomógł: 60
Dołączył: 25.02.2012

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


Jeszcze możesz dodać nową kolumnę, w której będziesz trzymał tylko tą część wewnętrzną [0000] - i wtedy sortujesz po dwóch kolumnach: title_symbol, title. (IMG:style_emoticons/default/tongue.gif) (IMG:style_emoticons/default/wink.gif)

Wiem, że nie ładne rozwiązanie z powodu redundancji danych, ale może mieć znaczenie wydajnościowe? Tak sobie gdybam.
Go to the top of the page
+Quote Post
--filout--
post
Post #4





Goście







Cytat(IProSoft @ 1.06.2012, 09:40:11 ) *
Jeżeli ciąg ma taką formę jak piszesz czyli 3litery - 4cyfry -3 litery możesz zastosować coś na wzór:
Kod
SELECT title, SUBSTRING( `title` , 1, 2 ) AS warunek1, SUBSTRING( `title` , 2, 3 ) AS warunek2
FROM tabela
ORDER BY warunek1, warunek2;


Jeśli nie znasz pozycji możesz dodać:
Kod
LOCATE('[', `title`);

np
Kod
SUBSTRING( `title` , LOCATE('[', `title`), LOCATE(']', `title`) )


W to mi graj (IMG:style_emoticons/default/biggrin.gif)
No i pomyśleć, że rozwiazanie było tak blisko (IMG:style_emoticons/default/wink.gif)

Dzieki
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: 8.10.2025 - 14:13