Autor | Zpráva | ||
---|---|---|---|
Jarda0001 Profil |
#1 · Zasláno: 6. 1. 2017, 16:58:54
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 * |
#2 · Zasláno: 6. 1. 2017, 17:05:55
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 |
#3 · Zasláno: 6. 1. 2017, 17:10:44
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 * |
#4 · Zasláno: 6. 1. 2017, 17:15:15
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' 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 |
#6 · Zasláno: 6. 1. 2017, 18:26:16
Jarda0001:
Dalo, pokud použijes REGEXP, ale to bude snad ještě pomalejší než LIKE. |
||
juriad Profil |
#7 · Zasláno: 6. 1. 2017, 18:39:08
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 |
#8 · Zasláno: 6. 1. 2017, 18:40:49
Jarda0001:
Není nic snažšího, než textový sloupec změnit na datum... Jinak WHERE `smd` LIKE '%2016%' OR `smd` LIKE '%2017%' |
||
Jarda0001 Profil |
#9 · Zasláno: 6. 1. 2017, 21:38:00
Kcko:
a pls můžeš to napasat? :-) |
||
Kcko Profil |
#10 · Zasláno: 6. 1. 2017, 21:50:31
Jarda0001:
Něco jako smd REGEXP '2016|2017'
|
||
Kajman Profil |
#11 · Zasláno: 6. 1. 2017, 21:54:32
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 |
#12 · Zasláno: 7. 1. 2017, 09:31:19
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 |
#14 · Zasláno: 7. 1. 2017, 12:16:56
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 |
#16 · Zasláno: 8. 1. 2017, 15:46:03
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 |
#17 · Zasláno: 8. 1. 2017, 18:43:38
Jarda0001:
proto říkám, hod za to echo mysql_error() a echo mysql_errno() a pohni, takhle se k výsledku dobereme za rok. |
||
Časová prodleva: 6 let
|
0