Autor Zpráva
Jarda0001
Profil
Dá se nějak zkrátit tento dotaz?

WHERE `smd` LIKE '%2016%' AND `smd` LIKE '%2017%'

Myslím tím sloučení dvou těchto podmínek do jedné
juriad_
Profil *
Jarda0001:
Spíš by ses měl ptát, proč pro hledání podle roků potřebuješ operátor LIKE, který je velice pomalý (nelze jinak, než přečíst každou jednu řádku v tabulce).
Jakého datového typu je sloupec smd?
TomášK
Profil
Není rozumné ukládat datumy jako řetězce, což patrně děláš - pak to vede k podobným dotazům. Pokud je v tom sloupci datum, předělej to na DATETIME a pak ten dotaz bude vypadat takto:

WHERE `smd` BETWEEN '2016-01-01' AND '2017-21-31'

Koukni na www.root.cz/clanky/uvaha-ohledne-zneuzivani-like-v-databazich
juriad_
Profil *
TomášK:
Prosinec má jen 12 měsíců a ne 21. :-)

Tvá ukázka platí pro DATE, pro DATETIME je to pak:
WHERE `smd` BETWEEN '2016-01-01' AND '2017-12-31 23:59:59'
případně
WHERE `smd` >= '2016-01-01' AND `smd` < '2018-01-01'
Jarda0001
Profil
juriad:
Sloupec smd je textový


TomášK:
Právě že sloupec smd je textový, takže nemohu v něm hledat jako v datumovém a potřebuji právě z něj pouze výrazy které obsahují 2016 nebo 2017
Kcko
Profil
Jarda0001:
Dalo, pokud použijes REGEXP, ale to bude snad ještě pomalejší než LIKE.
juriad
Profil
Jarda0001:
Urychlit to asi nepůjde. Některé databáze umožňují třídy znaků: LIKE '%201[67]%', ale MySQL mezi ně nepatří.

Pokud máš zaručené, že je v každém smd nanejvýš jeden rok, přidal bych sloupec s tím extrahovaným rokem. Pokud jich může být více, pak novou tabulku, která bude provázaná s tou obsahující smd - každý řádek bude obshovat jeden rok, k jednomu smd může bt více řádků.
Vyhledávání roků v takto předpřipravených datech bude skoro okamžité.
Tomášeek
Profil
Jarda0001:
Není nic snažšího, než textový sloupec změnit na datum...

Jinak
WHERE `smd` LIKE '%2016%' OR `smd` LIKE '%2017%'
Jarda0001
Profil
Kcko:
a pls můžeš to napasat? :-)
Kcko
Profil
Jarda0001:
Něco jako smd REGEXP '2016|2017'
Kajman
Profil
Jarda0001:

Pokud máte text a hledáte v něm, zda obsahuje poddtext '2016' a zároveň i poddtext '2017' v libovolném pořadí, tak zkrátit zápis z [#1] asi nepůjde.

Pokud by to bylo pomalé, můžete zkusit udělat fulltextový index.
Jarda0001
Profil
Kcko:
jsem vyzkoušel ale vyhodí chybu 'is_pe = 0 AND is_adt = 0 AND mime LIKE "pad%" AND smd REGEXP '2016|2017'
Kcko
Profil
tak nahrad jednoduche uvozovky za dvojite, nevim jake pouzivas na obalení dotazu.
Jarda0001
Profil
Kcko:
To jsem taky vyzzkoušel
is_pe = 0 AND is_adt = 0 AND mime LIKE "pad%" AND smd REGEXP "2016|2017"
Kcko
Profil
Jarda0001:
vypiš si mysql_error() a mysql_errno()
Mělo by to normálně fungovat, zkouším SELECT * FROM energie WHERE datum REGEXP "2015|2017"

Moderátor juriad: Odmazána část patřící jinam. Nevšiml jsem si, že se nejedná o autora vlákna.
Jarda0001
Profil
Když to spustím jako dotaz v mysql tak tam to běží správně ale pokud to změním již na stránce tak to prostě nejde :-(
Kcko
Profil
Jarda0001:
proto říkám, hod za to
echo mysql_error() a echo mysql_errno() a pohni, takhle se k výsledku dobereme za rok.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

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

0