2017-06-21 82 views
6

我在我的数据库中有一个编码字段。使用from_base64场上之后,它看起来是这样的:如何在MySQL中提取部分Base64编码的字符串?

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

有可能是串在路径的开始人数不详,不过,日期(YYYY // // MM DD)将始终有两个右边的字段(字符串后跟文件扩展名)。

我想按此YYYY // MM // DD模式进行排序,并获得具有此日期的所有路径的计数。

所以基本上我想这样做:

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

关于你得到这个工作的唯一办法是,如果你将你想搜索的文本分解到它自己的字段中。由于数据没有标识符(即名称/值对或json或xml),因此解析查询中的字符串将会占用大量处理器资源。我认为这是你的第一句话中的拼写错误,而你的意思是编码而不是解码。使用您提出的方法,您会看到显着的性能。运行解析解码列并将可搜索信息放入其自己列的更新运行速度会快得多。 –

+0

为什么插入一行时不将日期作为单独的列插入? – mikep

+0

2017年之前是单一而非双重斜线故意? –

回答

5

摘要

MySQL的SUBSTRING_INDEX进来有用通过查找指定的分隔符,如果一个负计数向后从末端计数这样做值被指定。

演示

Rextester演示: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; 

假设

假设为现在的你们之前的单斜杠在这个问题中给出的例子是一个错字,应该是一个双斜杠。 (如果事实证明这是不是我会更新我的答案的情况。)

1

有点疯狂,但它的工作原理

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),"-","/");