2017-06-21 74 views
6

Mam pole w mojej bazie danych, które jest zakodowane. Po użyciu from_base64 na boisku wygląda to tak:Jak wyodrębnić część łańcucha zakodowanego w Base64 w MySQL?

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

Nie może być nieokreślonej liczby ciągów na początku ścieżki, jednak datę (RRRR MM // // DD) zawsze mają dwa pola po prawej stronie (ciąg znaków, po którym następuje rozszerzenie pliku).

Chcę posortować według tego wzoru YYYY // MM // DD i uzyskać liczbę dla wszystkich ścieżek z tą datą.

Więc zasadniczo chcę, aby to zrobić:

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

O jedynym sposobem dostaniesz to do pracy jest, jeśli rozbić tekst, który chcesz przeszukać na własne pole. Ponieważ dane nie mają identyfikatorów (tj. Pary nazwa/wartość lub json lub xml), procesor będzie wymagał intensywnego przetwarzania, aby przeanalizować ciąg wewnątrz zapytania. Przypuszczam, że to literówka w pierwszym zdaniu, a miałeś na myśli zakodowaną zamiast dekodowania. Zobaczysz znaczący spadek wydajności dzięki zastosowaniu proponowanej przez Ciebie metody. Byłoby znacznie szybciej, aby uruchomić aktualizację, która analizuje zdekodowaną kolumnę i umieszcza informacje do wyszukania w swojej własnej kolumnie. –

+0

Dlaczego nie wstawiasz daty jako oddzielnej kolumny podczas wstawiania wiersza? – mikep

+0

Czy intencjonalny jest raczej singiel niż double slash przed 2017 r.? –

Odpowiedz

5

Podsumowanie

MySQL SUBSTRING_INDEX przychodzi przydatna dla tej szukając określonego ogranicznika i licząc wstecz od końca jeśli negatywny count wartość jest określona.

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; 

Założenia

założyliśmy teraz, że pojedynczy ukośnik przed wy w przykładzie podanym w pytaniu był literówka i powinna być podwójna kreska. (Jeśli okaże się, to nie jest przypadek będę aktualizować moją odpowiedź.)

1

trochę szalony, ale to działa

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