Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Order by po trzech kolumnach - czy ja już do reszty zdurniałem?
Forum PHP.pl > Forum > Bazy danych > MySQL
c2h5oh
Pomijając kwestię czy jest to rozsądne potrzebuje w jednym miejscu posortować wyniki selecta po trzech kolumnach:
Kod
SELECT * FROM `table` ORDER BY col1 DESC, col2 ASC, col3 DESC LIMIT 0,10

lub coś zbliżonego

niestety sortuje tylko po col1 i col2 - col3 zlewa zupełnie. Ograniczenie mysql 4.1, czy co? nie znalazłem w sieci ani jednego przykładu na order by z 3 kolumnami..

Wszelkie sugestie mile widziane.
devnul
a jesteś pewny że zachodzi taka konieczność (w sęsie czy baza napotyka problem i musi szukać 3 możliwości sortowania)?
c2h5oh
I owszem col1 = status (5 możliwości), col2 = typ (6 możliwości), col3 = id (klucz główny) - bardzo często zachodzi sytuacja gdy dla więcej niż 1 wiersza col1 i col2 są takie same, a wręcz w 90% przypadków są, tak więc col3 również powinno brać pod uwagę. Co więcej widzę w wynikach przypadki gdy są w złej kolejności..
phpion
Cytat(c2h5oh @ 17.12.2007, 21:36:34 ) *
Co więcej widzę w wynikach przypadki gdy są w złej kolejności..

Może masz złe typy kolumn?
c2h5oh
3x INT, to też nie to :/
nevt
no to może pokaż konkretnie to pytanie SQL, definicję tabeli, i jakie wyniki zwraca, bo na pewno nie jest to tabela z col1, col2 i col3...
to co pokazujesz TEORETYCZNIE powinno działać - skoro nie działa - to pokaż jak naprawdę to wygląda w TWOIM wykonaniu - gdzieś masz błąd i już... jak nie pokażesz prawdziwego kodu nie znajdziesz prawdziwej przyczyny problemów...
c2h5oh
Oczywiście jest "nieco" bardziej skomplikowane, ale do tego się sprowadza

  1. CREATE TABLE `product_tag` (
  2. `tid` int(10) UNSIGNED NOT NULL DEFAULT '',
  3. `pid` int(10) UNSIGNED NOT NULL DEFAULT '',
  4. KEY `pid` (`pid`),
  5. KEY `tid` (`tid`)
  6. ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  7.  
  8. CREATE TABLE `product` (
  9. `pid` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  10. `status` int(2) UNSIGNED NOT NULL DEFAULT '0',
  11. PRIMARY KEY (`pid`),
  12. KEY `search` (`pid`,`status`)
  13. ) ENGINE=MyISAM DEFAULT CHARSET=utf8

Powycinałem kolumny nie wykorzystywane w zapytaniu, żeby bałaganu nie wprowadzać
  1. SELECT p.*, COUNT(t.tid) AS matches FROM `product` p
  2. INNER JOIN `product_tag` t ON p.pid=t.pid WHERE ( (`tid` IN (val1, val2, val3,..)) AND (p.status>=jakis_status))
  3. GROUP BY t.pid ORDER BY matches DESC, p.STATUS ASC, p.pid DESC LIMIT 0, 10


Sortowanie po dowolnych 2 z tych 3 działa - nie ma problemu status+pid, matches+status, matches+pid, wszystkie trzy niestety już nie.
nevt
u mnie edytor zapytań podświetla we fragmencie
Kod
p.status ASC
wyraz status jako słowo zastrzeżone. spróbuj w całym zapytaniu ująć wszystkie nazy pól i tabel w `odwócone apostrofy` (w klauzuli ORDER BY w szczególności) ...
poza tym fragment
Kod
IN (val1, val2, val3,..)
zgłasza błąd składni - ale to chyba tylko przykład (chociaż prosiłem o rzeczywiste zapytanie - więc kto wie)...

powodzenia.
c2h5oh
przykładowe zapytanie
  1. SELECT p.*, COUNT(t.tid) AS matches FROM `product` p
  2. INNER JOIN `product_tag` t ON p.pid=t.pid WHERE ( (`tid` IN (1,4,5)) AND (p.status>=2))
  3. GROUP BY t.pid ORDER BY matches DESC, p.STATUS ASC, p.pid DESC LIMIT 0, 10
Indeo
Zapytanie jest poprawne. Używanie słów zastrzeżonych mysql'a jest niebezpieczne. Można stracić długie wieczory nad poszukiwaniem błędu. Chyba najlepiej by było jakbyś pokazał wynik Twojego zapytania w postaci wynikowej tabeli, a najlepiej dodatkowo pliki sql całych tabel. Jesteśmy ciekawi co w tym siedzi winksmiley.jpg
c2h5oh
To jeszcze udziwnię, żeby do było zabawniej:

  1. SELECT p.*, COUNT(t.tid) AS matches FROM `product` p
  2. INNER JOIN `product_tag` t ON p.pid=t.pid WHERE ( (`tid` IN (1,4,5)) AND (p.status>=2))
  3. GROUP BY t.pid ORDER BY matches DESC, p.STATUS ASC, p.pid DESC LIMIT 0, 10


Nie działa

  1. SELECT p.*, COUNT(t.tid) AS matches FROM `product` p
  2. INNER JOIN `product_tag` t ON p.pid=t.pid WHERE ( (`tid` IN (1,4,5)) AND (p.status>=2))
  3. GROUP BY t.pid ORDER BY matches DESC, p.STATUS ASC, p.pid ASC LIMIT 0, 10


Smiga bez problemu

Czy ktos ma jakiekolwiek pojecie o co biega?
Indeo
Pokaż wynik tych zapytań.
clarkfinger
Jeżeli pierwsze zapytanie zadziałało, to nie ma bata - drugie też musi - jedyne co mi przychodzi go głowy, to że niewłaściwie interpretujesz sortowanie i dane posortowane bierzesz, za nieposortowane. Ale żeby to sprawdzić, musimy zobaczyć wynik obu zapytań.
Indeo
Otóż to. Jak powie św. Tomasz. "Nie zobaczę - nie uwierzę" smile.gif
nevt
7 postów wstecz zasugerowałem, żeby wszystkie nazwy pól i tabel ująć w `odwrócone apostrofy` - zgodnie ze składnią MySQL - z prostej przyczyny - wyrażnie STATUS jest słowem zastrzeżonym w MySQL i swobodne używanie go wewnątrz zapytania może (chociaż nie musi) prowadzić do takich trudnych do wychwycenia błędów... ale niestety kolega c2h5oh (a dlaczego nie c2h5cooh questionmark.gif?- dużo zdrowsze, nie degraduje wątroby i jest zalecane w schorzeniach reumatycznych smile.gif ) jest tak zapatrzony we własne racje, że nie raczy sprawdzić, czy jest tu coś narzeczy....
c2h5oh
Sprawa wyjasnila sie juz kawal czasu i temu i dobrze myslalem - zdurnialem do reszty - bylo sortowanie po councie i jakies stare duplikaty biggrin.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.