2011-10-18 4 views
1

のは、私は2つのテーブル(私は私と一緒にテーブルからの質問に無関係なすべてのものを削除して、いくつかのサンプルのものを作るので、負担しようとしています:)MySQL列内の部分文字列の数に基づいて選択しますか?

___________________   ________________________ 
    |File    |   |Content    | 
    |_________________|   |______________________| 
    |ID Primary Key | 1  * |ID Primary Key  | 
    |URL Varcher(255) |---------|FileID Foreign Key | 
    |_________________|   | ref File(ID)  | 
           |FileContent Text  | 
           |______________________| 

ファイルがURLを持っているとしましょう。各ファイルに対応する多くのコンテンツ項目が存在する可能性があります。

私はいくつかの問題を抱えているこれらのテーブルを使用してクエリを作成する必要があります。私は基本的にクエリは、簡単な言葉で、言いたい:「そのファイルに関連付けられているすべてのコンテンツのエントリで表示されます 『

Xを』ファイルのURLおよびサブストリング回の 合計を選択して」

私はSQLの選択にはかなりいいですが、私は集計関数ではあまりよくありませんし、私を失望させています。任意のヘルプは非常に高く評価されています:)

答えて

1

クエリは効率的ではありませんが、あなたにヒントを与えるかもしれません:あなたはcntsサブクエリで使用LEFT JOINの残りの部分をUNION ALLできるコンテンツテーブルに一致していないファイルを追加するには

SELECT url, cnt 
FROM (
    SELECT 
    f.id, 
    IFNULL(
     SUM(
     (LENGTH(c.text) - LENGTH(REPLACE(c.text, f.url, '')))/LENGTH(f.url) 
    ), 
     0 
    ) as cnt 
    FROM file c 
    JOIN content c ON f.id = c.fileid 
    GROUP BY f.id 
) cnts JOIN file USING(id); 

を。

+0

解決策をお寄せいただきありがとうございます。週末、仕事の忙しい週までこれを試す時間があります:) –

1

このソリューションは、REGEXPを使用して部分文字列を一致させようとします。 REGEXPは、一致する場合は1を返し、一致しない場合は0を返します。合計でSUM()を返します。 REGEXPは過度のように見えるかもしれませんが、単純な部分文字列よりも複雑なマッチングが可能です。

SELECT 
    File.ID, 
    File.URL, 
    SUM(Content.FileContent REGEXP 'substring') AS numSubStrs 
FROM File LEFT JOIN Content ON File.ID = Content.ID 
GROUP BY File.ID, File.URL; 

より複雑なマッチパターンが今まで必要とされない場合は簡単に方法はなくSUM()LIKECOUNT(*)を使用しています:

SELECT 
    File.ID, 
    File.URL, 
    COUNT(*) AS numSubStrs 
FROM File LEFT JOIN Content ON File.ID = Content.ID 
WHERE Content.FileContent LIKE '%substring%' 
GROUP BY File.ID, File.URL; 

がある場合に0を作り出すべき、LEFT JOINの使用を注意してください実際にはContentのエントリはありません。

+0

回答ありがとうございます。回答はまだありませんが、週末、忙しい週にこれを試す時間はありません:) –

関連する問題