2

さまざまな URL の負荷を調べ、ホスト名でグループ化する、このようなクエリがあります。かなり醜いですが、使用するのに十分な速さのようです。

醜い部分文字列 (ドメインの最初の部分をつかむ) がきれいに書けるようにするにはどうすればよいでしょうか? 一連のソーシャル メディア サイトからクエリを生成しているため、さらに多くのサイトが存在する可能性があります。

SELECT substring(r.name, 8, locate("/",substring(r.name FROM 8))-1) AS referer_domain,
       count(USER) AS hits,
       r.id
FROM core c,
     referer r
WHERE c.site_url = 12
    AND r.name LIKE '%/%'
    AND c.referer = r.id
    AND (substring(r.name, 8, locate("/",substring(r.name FROM 8))-1) = "www.delicious.com"
    OR substring(r.name, 8, locate("/",substring(r.name FROM 8))-1) = "www.facebook.com"
    OR substring(r.name, 8, locate("/",substring(r.name FROM 8))-1) = "m.facebook.com"
    OR substring(r.name, 8, locate("/",substring(r.name FROM 8))-1) = "www.reddit.com"
    OR substring(r.name, 8, locate("/",substring(r.name FROM 8))-1) = "twitter.com"
    OR substring(r.name, 8, locate("/",substring(r.name FROM 8))-1) = "news.ycombinator.com"
GROUP BY substring(r.name, 8, locate("/",substring(r.name FROM 8))-1)
ORDER BY hits DESC
4

4 に答える 4

2

あなたの場合、GROUP BY で参照できる出力列 referer_domain をすでに作成しています。

ビューが必要ですが、WHERE句で使用するには。

CREATE VIEW ref_domain_view AS SELECT *,substring(name, 8, locate("/",substring(name FROM 8))-1) as referer_domain FROM referer;

SELECT r.referer_domain,
   count(USER) AS hits,
   r.id
FROM core c,
 ref_domain_view r
WHERE c.site_url = 12
AND r.name LIKE '%/%'
AND c.referer = r.id
AND referer_domain = "www.delicious.com"
OR referer_domain = "www.facebook.com"
OR referer_domain = "m.facebook.com"
OR referer_domain = "www.reddit.com"
OR referer_domain = "twitter.com"
OR referer_domain = "news.ycombinator.com"
GROUP BY referer_domain
ORDER BY hits DESC
于 2012-06-02T13:01:08.867 に答える
0

これを行う1つの方法は、文字列抽出を行うユーザー定義関数(UDF)を作成することです。UDFは高速ですが、書くのはもっと面倒です。もう1つの方法は、SQL構文に沿った、より簡単なストアドプロシージャの一種であるストアド関数を作成することです。

于 2012-06-02T13:12:05.903 に答える
0

あなたはそのために使うことができますCREATE FUNCTION

于 2012-06-02T12:56:44.110 に答える
0

上記の2つの回答には非常に良い点がありますが、質問する必要があります。

すべての部分文字列関数呼び出しが本当に必要ですか?

次のようなことを試しましたか:

SELECT substring(r.name, 8, locate("/",substring(r.name FROM 8))-1) AS referer_domain,
   count(USER) AS hits,
   r.id
FROM core c,
 referer r
WHERE c.site_url = 12
AND r.name LIKE '%/%'
AND c.referer = r.id
AND r.name    = "http://www.delicious.com"
OR r.name     = "http://www.facebook.com"
OR r.name     = "http://m.facebook.com"
OR r.name     = "http://www.reddit.com"
OR r.name     = "http://twitter.com"
OR r.name     = "http://news.ycombinator.com"
GROUP BY substring(r.name, 8, locate("/",substring(r.name FROM 8))-1)
ORDER BY hits DESC

上記のクエリの唯一の問題は、追跡するドメインがさらに必要な場合、クエリを変更する必要があることです。ドメインをテーブルに入れてそのテーブルに結合すると、おそらく部分文字列を完全に取り除くことができ、クエリを変更する必要もありません。

于 2012-06-02T13:33:19.327 に答える