Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL]sortowanie po kolumnie SET
Forum PHP.pl > Forum > Przedszkole
rob_roy
Witam,

Mam problem z sortowaniem (niestandardowym).
Moje kryteria to:
-promocje (0/1)
-data (DESC)
-godzina (DESC)
-set promocje (war1,war2...,nul)

Zapytanie
  1. SELECT mid, uid, category, title, b_title, promotion, date, image_1, mid, city, promotion_c, (SELECT CASE WHEN FIND_IN_SET(promotion_c,'rybnik')=1 THEN 2 ELSE 1 END) AS sort FROM at20_adverts_norm
  2. WHERE db_data_id=1 AND publicate=1 AND category = 78 AND date<='2011-07-05' ORDER BY sort DESC, date DESC,time DESC


Wiem, nie jest to eleganckie ale tak sobie życzą i nie mam możliwości, całe szczęście że tabela niezbyt duża bo ten CASE... Heh szkoda gadać.

Powyższe zapytanie działa elegancko tak jak chce za wyjątkiem przypadku kiedy w kolumnie SET o nazwie promotion_c jest więcej niż jeden zestaw promocji np. war1, war2. Dla samego war1 działa gdy więcej nie znajduje żądanych wartości. Próbowałem też zmienić funkcję FIND_ .. na FIELD. Eksperymentowałem też z operatorami >= ale efekt mizerny.

Macie jakieś pomysły jak to usprawnić aby gdy w kolumnie SET jest więcej wartości, niezależnie od tego czy np. war1,war2,war3 będę znajdował np war2 ?

Pozdrawiam
nospor
nie: =1
a: >0
Gość
Cytat(nospor @ 5.07.2011, 08:46:00 ) *
nie: =1
a: >0


Próbowałem. Znajdowane są tylko pojedyncze wartości zawierające szukaną wartość

FIND_IN_SET(promotion_c,'sz1') znajdzie gdy promotion_c => sz1 a gdy: promotion_c => sz1,sz2 to już nie.
nospor
No ale zajrzyj do manuala i zobacz w jakiej kolejności podaje się dane argumenty....
http://dev.mysql.com/doc/refman/5.0/en/str...ion_find-in-set
Gość
Poradziłem sobie...

Funckja FIND_IN_SET sie nie sprawdza..

Za to FIELD i użycie wartosci bitowych działa doskonale

FIELD(promotion_c,1,2,3,5,9,15)>0

Wymaga tylko binarnego przeliczenia żądanych wartosci:

np

00001 =1
00010 =2
00011 =3
00101 =5
01001 =9
01111 = 1 + 2 + 4 +8

Pozdrawiam
nospor
Się nie sprawdza, bo używasz w złej kolejności - pisałem ci o tym...

nie: FIND_IN_SET(promotion_c,'sz1') > 0
a: FIND_IN_SET('sz1',promotion_c) > 0
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.