Autor Zpráva
Jcas
Profil
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
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
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
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
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

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: