Autor | Zpráva | ||
---|---|---|---|
Jcas Profil |
#1 · Zasláno: 15. 3. 2016, 15:38:27
Dobrý den
Pokud jsem měl psc uloženo v db jako číslo, tak to bylo jednoduché. Použil jsem BETWEEN..AND..OR Nyní mám ale psc jako text. To je způsobeno stavbou DB, kdy mám v jednom sloupci různé hodnoty(ulice, město, psc, atd. vše v jednom sloupci). V následujícím kódu můžete vidět, jak jsem začal přepisovat svou funkci z BETWEEN na LIKE. Dorazil jsem k Plzni a najednou tu máme 4*LIKE. 31%, 32%, 33%, 34%. Tak jsem začal hledat nějaký stručný zápis. např. LIKE IN ('31%', '32%', '33%', '34%')
Buď dělám něco špatně, nebo to nejde. Našel jsem řešení u REDEXP, ale tady se zase uvádí, že je to hodně pomalé. WHERE hodnota REGEXP '^31|^32|^33|^34' \
Jak můžete vidět ve funkci, tak na Moravě jsou ty psč tak rozbité, že nějaký stručný zápis bych potřeboval. Takže poradíte, jak na to prosím. function vratKraj($psc) { switch ($psc): case "Hl.m.+Praha": return $kraj = "k.hodnota LIKE 1%"; break; case "Středočeský": return $kraj = "k.hodnota LIKE 2%"; break; case "Plzeňský": return $kraj = "k.hodnota LIKE 3% "; // 30000-34999 break; case "Karlovarský kraj": return $kraj = "PSC BETWEEN 35000 AND 36999"; break; case "Jihočeský kraj": return $kraj = "PSC BETWEEN 37000 AND 39299"; break; case "kraj Vysočina": return $kraj = "(PSC BETWEEN 39300 AND 39699 OR PSC BETWEEN 58000 AND 59999 OR PSC BETWEEN 67400 AND 67699)"; break; case "Ústecký kraj": return $kraj = "PSC BETWEEN 40000 AND 44999"; break; case "Liberecký kraj": return $kraj = "(PSC BETWEEN 46000 AND 47999 OR PSC BETWEEN 51100 AND 51499)"; break; case "Královéhradecký kraj": return $kraj = "(PSC BETWEEN 50000 AND 51099 OR PSC BETWEEN 51500 AND 52999 OR PSC BETWEEN 54000 AND 55999 OR PSC BETWEEN 74100 AND 74499)"; break; case "Pardubický kraj": return $kraj = "(PSC BETWEEN 53000 AND 53999 OR PSC BETWEEN 56000 AND 57999)"; break; case "Jihomoravský kraj": return $kraj = "(PSC BETWEEN 60000 AND 67200 OR PSC BETWEEN 67850 AND 67859 OR PSC BETWEEN 68900 AND 69999)"; break; case "Zlínský kraj": return $kraj = "(PSC BETWEEN 68600 AND 68899 OR PSC BETWEEN 75500 AND 76999)"; break; case "Moravskoslezský kraj": return $kraj = "(PSC BETWEEN 70000 AND 74999 OR PSC BETWEEN 79200 AND 79349 OR PSC BETWEEN 79360 AND 79369 OR PSC BETWEEN 79380 AND 79599)"; break; case "Olomoucký kraj": return $kraj = "(PSC BETWEEN 75000 AND 75499 OR PSC BETWEEN 77000 AND 79199 OR PSC BETWEEN 79350 AND 79359 OR PSC BETWEEN 79370 AND 79379 OR PSC BETWEEN 79600 AND 79999)"; break; endswitch; } |
||
Fisir Profil |
#2 · Zasláno: 15. 3. 2016, 15:48:53
Reaguji na Jcase:
„mám v jednom sloupci různé hodnoty“ To je špatný návrh databáze. Databázi normalizuj a tvůj problém zmizí. |
||
Jcas Profil |
Fisir:
DB je dobrá - konec konců jste mi ji postavili Vy - profíci z JPW. www.zocschmoravskebranice.eu/DB-chovatelu/sklad/navrh_DB_2.pdf Možná asi jen to psc by mělo být uděláno jinak. |
||
juriad Profil |
Fisir:
Toto je vzhledem k obecné struktuře skoro optimální. Uživatel o sobě může vyplnit spoustu vlastností a jedna z nich je náhodou PSČ. Normalizací by narazil na problém, že přidáním dalši vlastnosti by musel do tabulky přidat další sloupec a změnit obslužný kód v PHP. Jcas: V tabulce USER_vlastnosti si přidej další sloupec datovy_typ , který bude zatím mít jen dvě hodnoty: text , int ; později možná budeš potřebovat přidat další.
V tabulce USER_data vytvoř sloupce pro každý datový typ: text_hodnota , int_hodnota (současný obecný hodnota jimi nahraď).
Dotazy na tabulku USER_data jsou dvojího charakteru:
1) znáš vlastnost, která tě zajímá, pak znáš i její datový typ, a znáš i sloupec, ve kterém je hodnota uložená 2) ptáš se na seznam všech vlastností uživatele, pak si prostě vytáhneš vše a v PHP si vybereš vždy sloupec s hodnotou podle jejího datového typu (sloupce s jinými datovými typu budou NULL ).
|
||
Fisir Profil |
#5 · Zasláno: 15. 3. 2016, 16:02:46
Reaguji na juriada:
Pardon, já z původního popisu pochopil, že má v jednom řádku a v jednom sloupci dohromady celou adresu. |
||
Jcas Profil |
#6 · Zasláno: 15. 3. 2016, 17:52:19
juriad:
Čistě teoreticky (nechci se hádat, protože jsem BFU), když už musím přidávat sloupec, nestačilo by pouze přidat `int_hodnota` a psc mít uloženo duplicitně? Jednou jako string v `hodnota` a jednou jako int v `int_hodnota` ? (stejně tak by to bylo při dalším int, kdybych někdy potřeboval)
Ukládání stejně ovládám já (muj.php), tak vím jestli od uživatele ukládám string, nebo int. A když vezmu ty dotazy na tabulku jak píšeš: 1/ znám datový typ a proto vím, že v `int_hodnota` je číslo
2/ vytáhnu vše a potom tedy mám buď 'hodnota'-null vs 'hodnota'-int
|
||
Kajman Profil |
#7 · Zasláno: 15. 3. 2016, 21:40:05
PSČ v některých zemích není jen číslo.
Když si uděláte číselník PSČ, tak můžete validovat správně zadané PSČ, rovnou k němu přiřadit uživateli město a samozřejmě i odkazovat do číselníku krajů. kraje zeme, id_kraje, nazev psc zeme, psc_od, psc_do, mesto, id_kraje |
||
Časová prodleva: 9 let
|
0