Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Order by po trzech kolumnach - czy ja już do reszty zdurniałem?
c2h5oh
post
Post #1





Grupa: Zarejestrowani
Postów: 29
Pomógł: 1
Dołączył: 6.10.2006

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


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.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 15)
devnul
post
Post #2





Grupa: Zarejestrowani
Postów: 1 470
Pomógł: 75
Dołączył: 21.09.2005
Skąd: że znowu

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


a jesteś pewny że zachodzi taka konieczność (w sęsie czy baza napotyka problem i musi szukać 3 możliwości sortowania)?


--------------------
Profesjonaliści są przewidywalni...
strzeż się amatorów...
FL4SHB4CK - imprezy, galerie, lokale
Go to the top of the page
+Quote Post
c2h5oh
post
Post #3





Grupa: Zarejestrowani
Postów: 29
Pomógł: 1
Dołączył: 6.10.2006

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


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..
Go to the top of the page
+Quote Post
phpion
post
Post #4





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




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?
Go to the top of the page
+Quote Post
c2h5oh
post
Post #5





Grupa: Zarejestrowani
Postów: 29
Pomógł: 1
Dołączył: 6.10.2006

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


3x INT, to też nie to :/
Go to the top of the page
+Quote Post
nevt
post
Post #6





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


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...


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
c2h5oh
post
Post #7





Grupa: Zarejestrowani
Postów: 29
Pomógł: 1
Dołączył: 6.10.2006

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


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.

Ten post edytował DeyV 17.12.2007, 23:33:48
Powód edycji: formatowanie kodu
Go to the top of the page
+Quote Post
nevt
post
Post #8





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


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.


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
c2h5oh
post
Post #9





Grupa: Zarejestrowani
Postów: 29
Pomógł: 1
Dołączył: 6.10.2006

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


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


Ten post edytował c2h5oh 18.12.2007, 12:31:14
Go to the top of the page
+Quote Post
Indeo
post
Post #10





Grupa: Zarejestrowani
Postów: 295
Pomógł: 7
Dołączył: 26.03.2004
Skąd: Opole

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


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


--------------------
Go to the top of the page
+Quote Post
c2h5oh
post
Post #11





Grupa: Zarejestrowani
Postów: 29
Pomógł: 1
Dołączył: 6.10.2006

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


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?
Go to the top of the page
+Quote Post
Indeo
post
Post #12





Grupa: Zarejestrowani
Postów: 295
Pomógł: 7
Dołączył: 26.03.2004
Skąd: Opole

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


Pokaż wynik tych zapytań.


--------------------
Go to the top of the page
+Quote Post
clarkfinger
post
Post #13





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 17.12.2007

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


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ń.

Ten post edytował clarkfinger 20.12.2007, 00:11:26


--------------------
Kropla wody może rzeźbić skały jeśli działa dostatecznie długo, tak człowiek może rozwiązać każdy problem jeśli pragnie dostatecznie bardzo...
Go to the top of the page
+Quote Post
Indeo
post
Post #14





Grupa: Zarejestrowani
Postów: 295
Pomógł: 7
Dołączył: 26.03.2004
Skąd: Opole

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


Otóż to. Jak powie św. Tomasz. "Nie zobaczę - nie uwierzę" smile.gif


--------------------
Go to the top of the page
+Quote Post
nevt
post
Post #15





Grupa: Przyjaciele php.pl
Postów: 1 595
Pomógł: 282
Dołączył: 24.09.2007
Skąd: Reda, Pomorskie.

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


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....


--------------------

-
Oh no, my young coder. You will find that it is you who are mistaken, about a great many things... -
Go to the top of the page
+Quote Post
c2h5oh
post
Post #16





Grupa: Zarejestrowani
Postów: 29
Pomógł: 1
Dołączył: 6.10.2006

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


Sprawa wyjasnila sie juz kawal czasu i temu i dobrze myslalem - zdurnialem do reszty - bylo sortowanie po councie i jakies stare duplikaty biggrin.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 04:44