Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: coś pokroju explode?
Forum PHP.pl > Forum > Bazy danych > MySQL
fiszol
Witam, szukam sposobu na wyciągnięcie tylko jednej wartości z pola text w którym przechowywane są dane odseparowane spacjami, chciałbym tę wartość wybrać na drodze zapytania żeby później uniknąć explodowania stringa który sięga wagą kilkunastu kb. Orócz tegu nurtuje mnie jeszcze jedno - a mianowicie czy da się zwrócić dane z tego zapytania wdłg ORDER BY 'właśnie_ta_wartość' ?


pozdrawiam,
fiszol
dr_bonzo
1. masz zle zaprojektowana baze danych
2. jak chcesz okreslic ktora z tych wartosci wyciagnac?
fiszol
ad1. to nie moja baza
ad2. to wartośc po 33 spacji więc czymś pokroju explode, żeby nie używać jak teraz:

  1. <?
  2. $q=$db->get_results("SELECT * FROM $cdb.character ORDER BY name ASC");
  3. foreach ( $z as $q )
  4.  
  5. {
  6. $data = $z->data;
  7. $data =explode(,$data);
  8. echo $data[33];
  9. };
  10. ?>

No i order zamiast by name chciałbym mieć wdłg wartości po 33 spacji...

//[php] się chrzni przy edycji...
orson
witam

Kod
SUBSTRING_INDEX(str,delim,count)

musisz tylko dodać do tego klika modyfikacji - ta funkcja zwróci ci tekst po 33 spacji (SUBSTRING od pozycji najbliższej spacji lub coś podobnego) i dać sobie to jako alias i wtedy możesz po tym posortować ...

pozdrawiam
fiszol
Cytat
SUBSTRING_INDEX(str,delim,count)

Returns the substring from string str before count occurrences of the delimiter delim. If count is positive, everything to the left of the final delimiter (counting from the left) is returned. If count is negative, everything to the right of the final delimiter (counting from the right) is returned. SUBSTRING_INDEX() performs a case-sensitive match when searching for delim.

Więc wedle tego co napisano powyżej zwróci mi wszystko co znajdzie się na lewo lub prawo od jednostki po 33 spacji i dokładnie tak się dzieje

Dzięki i tak, bo w manualu tuż nad SUBSTRING_INDEX znalzłem jeszcze SUBSTRING i skleciłem zapytanie w taki sposób:
  1. SELECT SUBSTRING(SUBSTRING_INDEX(DATA,' ',33), -2) //(...)

, dostaje więc to czego chcem - został mi jeszcze jeden mał problem - jeśli dam:
  1. SELECT
  2. //jakies tam pola, miedzy innymi TO felerne
  3. ORDER BY SUBSTRING(SUBSTRING_INDEX(DATA,' ',33), -2)

zwrot dostaję jakiś pomieszany, a już napewno nie ułożony jak należy
orson
witam ...

Do kolumny SUBSTRING(SUBSTRING_INDEX(data,' ',33), -2) dodaj alias (AS foo) i potem ORDER BY foo.

Jeżeli to jest liczba to musisz wykonać CAST (możesz przy definicji kolumny, odpadnie dodatkowa funkcja w ORDER BY. Jeżeli to nie liczna to spróbuj jeszcze dać TRIM.

pozdrawiam
fiszol
nie potrafię sobie poradzić z tym CAST()'em a dorzucenie aliasu nie daje pożądanych rezultatów, na chwile obecną moje query wygląda tak:

  1. SELECT id, name, race, class, map, position_x, position_y, SUBSTRING(SUBSTRING_INDEX(DATA,' ',33), -2) AS DATA
  2. FROM `character` ORDER BY DATA DESC


zwrot z samego data wygląda np tak:
4
12
7
11
itd...

może problemem jest to że data ma raz jedną, raz dwie cyfry?
jak powinno więc wyglądać to zapytanie?

pozdro i dzięki za dotychczasową pomoc
orson
Witam.

Kod
CAST (SUBSTRING(SUBSTRING_INDEX(data,' ',33), -2) AS SIGNED) AS date


pozdrawiam
fiszol
dzieki, teraz już jest idealnie.
death from beyond
Cytat(dr_bonzo @ 1.11.2006, 16:36:01 ) *
1. masz zle zaprojektowana baze danych


Nie rozumiem dlaczego.... a co zrobić z tekstem np. w forum? wydaje mi się, że będzie zapisane właśnie w takim polu `text` smile.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.