Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ MySQL _ Problem z zapytaniem

Napisany przez: Belze 11.12.2009, 11:57:19

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

Napisany przez: nospor 11.12.2009, 12:00:19

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

Napisany przez: zzeus 11.12.2009, 12:03:02

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

Napisany przez: Belze 11.12.2009, 12:08:13

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

Napisany przez: nospor 11.12.2009, 12:14:18

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

Napisany przez: Belze 11.12.2009, 12:17:36

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?


Napisany przez: nospor 11.12.2009, 12:20:27

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

Napisany przez: phpion 11.12.2009, 12:26:20

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

Napisany przez: Belze 11.12.2009, 12:29:52

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ć?

Napisany przez: phpion 11.12.2009, 12:32:53

  1. http://www.php.net/echo ','.http://www.php.net/implode(',', http://www.php.net/array(1, 5, 7, 8, 15, 19)).',';

Napisany przez: Belze 11.12.2009, 12:37:27

@phpion - wiem, wrzucilem odpowiedz nie widzac Twojej wypowiedzi. tak zrobie - jest to wyjscie z tej sytuacji smile.gif

dziękuję bardzo wszystkim!

Napisany przez: piotrooo89 11.12.2009, 12:38:38

niemniej ten sposób pod względem optymalizacji jest kompletnym niewypałem, 0 tu jest optymalizacji....

Napisany przez: Belze 11.12.2009, 12:45:12

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.

Napisany przez: piotrooo89 11.12.2009, 12:46:20

nie wiem czy to Ci potem popłaci, jak będziesz chciał jakoś grupować te dane to się zajedziesz.

Napisany przez: Belze 11.12.2009, 12:53:28

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 ;/

Napisany przez: piotrooo89 11.12.2009, 13:05:09

ja takie sprawy załatwiam mówiąc klientowi że dodatkowy dzień pozwoli zrobić coś lepszego.

Napisany przez: Belze 11.12.2009, 13:31:49

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.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)