2017-06-21 21 views
6

Veritabanımda kodlanmış bir alanım var. sahada from_base64 kullandıktan sonra bu gibi görünüyor:MySQL'de Base64 kodlu bir dizenin bir kısmı nasıl çıkarılır?

<string>//<string>//<string>/2017//06//21//<string>//file.txt 

yolun başında dizeleri belirsiz sayıda olabilir, ancak, tarih (YYYY // AA // GG) her zaman iki tane olacak sağdaki alanlar (bir uzantının ardından dosya uzantısı).

Bu YYYY // AA // DD desenine göre sıralamak ve bu tarihe sahip tüm yollar için bir sayı almak istiyorum.

Yani temelde bunu yapmak istiyorum:

select '<YYYY//MM//DD portion of decoded_path>', count(*) from table group by '<YYYY//MM//DD portion of decoded_path>' order by '<YYYY//MM//DD portion of decoded_path>'; 
+2

çalışır eğer Aramak istediğiniz metni kendi alanına ayırın. Verilerin tanımlayıcıları olmadığından (örn. Isim/değer çiftleri veya json veya xml), bir sorgu içindeki dizgiyi ayrıştırmak için işlemci yoğun olacaktır. İlk cümlede yazım hatası olduğunu ve kodu çözülmek yerine kodlanmış demek istedim. Önerdiğiniz yöntemi kullanarak önemli bir performans isabet göreceksiniz. Kod çözülmüş sütunu ayrıştıran ve aranabilir bilgiyi kendi sütunununa koyan bir güncelleme çalışması olması çok daha hızlı olacaktır. –

+0

Neden satır eklediğinizde tarihi ayrı bir sütun olarak eklemiyorsunuz? – mikep

+0

2017'den önce tekil yerine çift eğik çizgi biter mi? –

cevap

5

Özeti

MySQL en SUBSTRING_INDEX belirtilen sınırlayıcı arayan ve negatif sayım eğer ucundan geriye doğru sayarak bunu faydalı olmaktadır değer belirtildi.

Demo

Rextester demo: http://rextester.com/TCJ65469

SQL

SELECT datepart, 
     COUNT(*) AS occurrences 
FROM 
(SELECT CONCAT(
    LEFT(SUBSTRING_INDEX(txt, '//', -5), INSTR(SUBSTRING_INDEX(txt, '//', -5), '//') - 1), 
    '/', 
    LEFT(SUBSTRING_INDEX(txt, '//', -4), INSTR(SUBSTRING_INDEX(txt, '//', -4), '//') - 1), 
    '/', 
    LEFT(SUBSTRING_INDEX(txt, '//', -3), INSTR(SUBSTRING_INDEX(txt, '//', -3), '//') - 1)) 
    AS datepart 
FROM tbl) subq 
GROUP BY datepart 
ORDER BY datepart; 

Varsayımlar

şimdilik kabul ettiniz şöyle denilir önce tek çizgi Soruda verilen örnekte bir yazım hatası vardı ve bir çift eğik çizgi olmalıydı. olduğu

1

biraz deli (Bu ortaya çıkarsa bu. cevabımı güncelleriz böyle değil) ama o işe bu alırsınız tek yolu Hakkında

select REPLACE(SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE('<string>//<string>//<string>/2017//06//21//<string>//file.txt',"//","-"),"/",-1),"-<",1),"-","/"), count(*) from `chaissilist` group by REPLACE(SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE('<string>//<string>//<string>/2017//06//21//<string>//file.txt',"//","-"),"/",-1),"-<",1),"-","/") order by REPLACE(SUBSTRING_INDEX(SUBSTRING_INDEX(REPLACE('<string>//<string>//<string>/2017//06//21//<string>//file.txt',"//","-"),"/",-1),"-<",1),"-","/"); 
İlgili konular