2017-03-01 6 views
1

私はサーバにすべてのHTTPリクエストを記録するテーブルを用意していますが、APIが長すぎるかどうかを知ることを目標にしています。SQLグループの接尾辞が異なるすべての類似項目

例:

uri    | rtime 
--------------------- 
item/1   | 0.1 
item/2   | 0.1 
item/3   | 0.1 
item/comments/1 | 0.2 

だから私はこのクエリを作った:

SELECT uri, COUNT(1) as count, AVG(rtime) as avgTime 
FROM access_log 
GROUP BY uri 
ORDER BY avgTime DESC 

問題はどのようにグループ化することができ、それは例えば、item/1item/2item/3

のためのグループないこと、です/の後の最後の数字を削除するようにしますか?

EDIT:

私は唯一のストリップ番号にこれをしたい端からではなく、文字列

+0

あなたは常に文字列の末尾の数字を持っているのだろうか?複数の文字番号(10,666)でもかまいませんか? – HoneyBadger

+0

確かに。常に数字、任意の数字(0 - > infi)にすることができます – Amit

答えて

1

オプションは数字が続くスラッシュでURIの結末を識別するために、MySQLのREGEXP演算子を使用することですワン。この場合、URIの末尾部分を部分文字列で取り除くことができます。そうでなければ、集約するときに完全URIを使用します。結果を取得するための関数に建て

SELECT CASE WHEN uri REGEXP '^.*/[0-9]' 
       THEN SUBSTRING(uri, 1, INSTR(uri, '/')-1) 
       ELSE uri END AS uri, 
     COUNT(1) as count, 
     AVG(rtime) as avgTime 
FROM access_log 
GROUP BY CASE WHEN uri REGEXP '^.*/[0-9]' 
       THEN SUBSTRING(uri, 1, INSTR(uri, '/')-1) 
       ELSE uri END 
ORDER BY avgTime DESC 
+0

あまりにも強力です。文字列でも動作するので、例えば 'users/get'と' users/delete'はグループ化されます – Amit

+0

@Amit回答が更新されました。 –

+0

それは動作します。 'uri'の中には' item/undefined'がありますが、まだグループ化されているので大丈夫です。それを読む方法を知っています。 また、 'CHARINDEX'に相当するMySQLが' LOCATE'であることに注意してください – Amit

0

使用SUBSTRINGとCHARINDEX:

SELECT SUBSTRING(uri,LEN(uri),INSTR('/',uri)), COUNT(1) as count, 
    AVG(rtime) as avgTime 
    FROM #table 
    GROUP BY SUBSTRING(uri,LEN(uri),INSTR('/',uri)) 
    ORDER BY avgTime DESC 
+0

MySQLにはCHARINDEX関数がありません –

関連する問題