Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problem z zapytaniem
Forum PHP.pl > Forum > Bazy danych > MySQL
Belze
Witam

Mam drobny problem - mam w bazie tabele "wyswietlajnews_wdziale", a w niej rekordy, o konstrkcji - "1,5,7,8,15,19" gdzie cyfry to numery działów. W konkretnym dziale wyswietlane sa newsy poprzez sprawdzenie czy ten news ma sie wyswietlac w tym dziale . Czy da się skonstruować zapytanie poprzez LIKE, czy dopiero po wyjeciu z bazy wyciagnac to w php?
Gdyby bylo to zrobione w sposób select * from baza where wyswietlajnews_wdziale LIKE '$iddzialu' , to w dziale powiedzmy 1 wyswietliloby sie rowniez gdyby w danym rekordzie bylyby wartosci np. 15,16 (bo "znalazłby" "1").
Niewiem czy to poprawnie wytłumaczyłem.

Szukałem odpowiedzi w necie ale bez rezultau ;/

z gory dzieki za pomoc
nospor
zacznijmy od tego ze masz źle skontruowaną baze.
zamiast pola o wartosci 1,5,7,8,15,19
powienienes miec tabele o strukturze:
idNews | idDzialu

przykladowe dane dla dzialu o id 1
1 | 1
1 | 5
1 | 7
1 | 8
1 | 15
1 | 19

Wyszukiwanie po takiej strukturze to juz normalne zapytania sql
zzeus
Odradzam taką konstrukcję, jeśli możesz to lepiej zrób osobną tabelę która będzie łączyć dział z newsami, coś w stylu
dzial_newsy
id_dzial, id_news

Przy pobieraniu danych użyj odpowiedniego joina i będziesz miał to co potrzeba bez używania LIKE które w tym przypadku będzie mało optymalne
Belze
chyba nie do końca przedstawiłem to jasno.

podczas edytowania - dodawania newsa w CMSie wybiera sie czy ma sie wyswietlic na str glownej, czy w dzialach i czy w jeszcze innym miejscu. jezeli w dzialach to pojawia sie spis dzialow i zaznacza sie dokladnie w ktorych. w bazie w kazdym newsie jest kolumna "wyswietlajnews_wdziale" i tam wpisywane sa id dzialow, przy ktorych ten news ma byc wyswietlany.
w konkretnym dziale chcialbym, aby przeanalizowal ta kolumne i sprawdzil czy w danym rekordzie wystepuje dokladnie to id dzialu
nospor
Cytat
chyba nie do końca przedstawiłem to jasno.
wyraziles sie bardzo jasno. I ja, wydaje mi sie, ze tez bardzo jasno ci napisalem ze masz złą strukture i najlepiej by bylo jakbyś zamienil na tę, co ci zaproponowałem
Belze
problem w tym, że klientka nagle zmienila swoja wizje tego co bedzie, w cholere poszla moja praca i teraz nie mam czasu na przekonstuowanie bazy. jest to mozliwie technicznie, czy zmiana konstrukcji to jedyne wyjscie?

nospor
Mozesz uzyc wyrazenia regularnego (RLIKE) by wyciągnac te id. Przy pomocy wyrazenia bedziesz mogl podac ze id musi sie konczyc przecinkiem lub byc ostatnim id w ciagu
phpion
W takim razie najprościej będzie jeśli przed i po każdej liczbie będzie końcowy przecinek, czyli zamiast:
Kod
1,5,7,8,15,19

będziesz miał:
Kod
,1,5,7,8,15,19,

Wtedy tworząc warunek z LIKE nie dajesz:
  1. LIKE '$iddzialu'

tylko:
  1. LIKE '%,$iddzialu,%'

czyli otaczasz identyfikator działu przecinkami (i zapomniałeś o %). Chyba to będzie najprostsze wyjście w tej sytuacji, aczkolwiek zdecydowanie lepiej byłoby przeprojektować bazę.
Belze
myślałem o tym - musi kończyć się przecinkiem, być poprzedzony przecinkiem i być ostatnim lub pierwszym w ciągu. jeżeli pierwszym i ostatnim, to przecinek przed albo po chyba że jest to jedyny element. ciezko to wyglada ;/ ktoś pomoże takie coś skonstruować?
phpion
  1. echo ','.implode(',', array(1, 5, 7, 8, 15, 19)).',';
Belze
@phpion - wiem, wrzucilem odpowiedz nie widzac Twojej wypowiedzi. tak zrobie - jest to wyjscie z tej sytuacji smile.gif

dziękuję bardzo wszystkim!
piotrooo89
niemniej ten sposób pod względem optymalizacji jest kompletnym niewypałem, 0 tu jest optymalizacji....
Belze
niestety - poprzednio bylo tak, ze newsy byly oddzielne, dla dzialow (kazdy news mial przypisane w ktorym dziale sie wyswietla). nagle klientka zmienila decyzje - a czasu niestety nie, trzeba bylo cos na szybko zrobic.
piotrooo89
nie wiem czy to Ci potem popłaci, jak będziesz chciał jakoś grupować te dane to się zajedziesz.
Belze
zanim beda wrzucane dane, mam nadzieje ze przeforsuje troche czasu na przebudowanie bazy, zawsze mam niesmak jak jest to zrobione "na szybko", taka fuszerka - dzis jednak musi byc tak jak klient chcial - niestety ;/
piotrooo89
ja takie sprawy załatwiam mówiąc klientowi że dodatkowy dzień pozwoli zrobić coś lepszego.
Belze
gdyby to takie łatwe było, ale czas 2 dni, a poprawek na tydzień - nie ma możliwości przedłużenia. a klient jest pośrednikiem, wiec gucio go obchodzi, że coś nie będzie idealnie zrobione (kod, optymalizacja) etc.
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.