| 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: 10 let
|
|||
0