2017-06-10 1 views
0

私は記事のタイトルに使用されている単語の表を持っています。私は、セットや記事のタイトルで最も使用されていない言葉を探したい。MySQLクエリ:使用されていない単語を最低限見つけよう

例:

タイトル:

"Congressman Joey of Texas does not sign bill C1234." 
"The pretty blue bird flies at night in Texas." 
"Congressman Bob of Arizona is the signs bill C1234." 

表は以下が含まれます。この場合

表WORDS_LIST

---------------------------------------------------- 
| INDEX ID | WORD      | ARTICLE ID | 
---------------------------------------------------- 
| 1  | CONGRESSMAN    | 1234  | 
| 2  | JOEY      | 1234  | 
| 3  | SIGN      | 1234  | 
| 4  | BILL      | 1234  | 
| 5  | C1234     | 1234  |  
| 6  | TEXAS     | 1234  | 
| 7  | PRETTY     | 1235  | 
| 8  | BLUE      | 1245  | 
| 9  | BIRD      | 1245  | 
| 10  | FLIES     | 1245  | 
| 11  | NIGHT     | 1245  | 
| 12  | TEXAS     | 1245  | 
| 13  | CONGRESSMAN    | 1246  | 
| 14  | BOB      | 1246  | 
| 15  | ARIZONA     | 1246  | 
| 16  | SIGNS     | 1246  | 
| 17  | BILL      | 1246  | 
| 18  | C1234     | 1246  | 
---------------------------------------------------- 

、言葉記事の最小数で使用されるだろう「きれいな青、夜は、ハエ」。

このクエリを最適に作成する方法については、私に感謝します。これまでのところ私が始めたのは以下の通りです。 PHPで何かを書くこともできますが、クエリが高速になると考えました。

SELECT distinct a1.`word`, count(a1.`word`) 
FROM mmdb.words_list a1 
JOIN mmdb.words_list b1 
ON a1.id = b1.id AND 
upper(a1.word) = upper(b1.word) 
where date(a1.`publish_date`) = '2017-06-09' 
group by `word` 
order by count(a1.`word`); 
+0

質問には何がありますか?あなたが望むものを返さないのですか?あなたが返すものの例を見せてもらえますか? –

+1

'DISTINCT'は必要ありません。 'GROUP BY'はそれが別個であることを保証します。 – Barmar

+1

なぜあなたは自分自身にテーブルを参加させていますか? – Barmar

答えて

0

これを試してください。それはもう少しシンプルだし、正しい結果を返す必要があります:自己結合が必要な理由私が表示されていない

SELECT `WORD`, 
    COUNT(*) as `num_articles` 
FROM `WORDS_LIST` 
WHERE date(`publish_date`) = '2017-06-09' 
GROUP BY `WORD` 
ORDER BY COUNT(*) ASC; 
+0

彼は*少なくとも*使用された単語を望んでいるので、それは 'ASC'でなければなりません。 – Barmar

+0

ありがとう@Barmar。修正しました。 –

+0

元のクエリと同じ結果がありましたが、これは正しいことを確認して、途中です。 – ReeseB

4

select wl.word, count(*) 
from mmdb.words_list wl 
where date(wl.`publish_date`) = '2017-06-09' 
group by wl.word 
order by count(*); 

あなたは言葉の固定数を取得するためにlimitを追加することができます:ちょうどこのような何かを行います。

where publish_date >= '2017-06-09' and publish_date < '2017-06-10' 

この式は、MySQLはインデックスを使用することができます:それは時間のコンポーネントを持っている場合

where publish_date = '2017-06-09' 

publish_dateは日付がすでにある場合は、として比較を行う必要があります。

関連する問題