2016-04-11 7 views
0

重複しているとマークする前に注意深くお読みください。そうではない。where句の配列を使用すると、チェックされたフィールドに昏睡区切りの単語が含まれています

私は質問という名前のテーブルを持っている、と私はここで昏睡区切り値(キーワード)

を受け入れ、そのテーブルのフィールドquestionMetaTagsを持っているが、私のテーブルです:

`questionID` int(11) NOT NULL AUTO_INCREMENT, 
`questioncategoryID` int(11) NOT NULL, 
`questionstatusID` int(11) NOT NULL, 
`organizationID` int(11) NOT NULL, 
`legalformID` int(11) DEFAULT NULL, 
`questionProtocolID` varchar(45) DEFAULT NULL, 
`questionDisplayedRecordID` int(11) NOT NULL, 
`questionTitle` text NOT NULL, 
`questionSummary` text, 
`questionText` longtext NOT NULL, 
`questionAnswerSummary` text, 
`questionAnswerText` longtext, 
`questionMetaTags` text, 
`questionAskedBy` int(11) NOT NULL, 
`questionAnsweredBy` int(11) DEFAULT NULL, 
`questionAskedOnDate` datetime NOT NULL, 
`questionAnsweredOnDate` datetime DEFAULT NULL, 
`questionAskedFromIp` varchar(255) NOT NULL 

私は、クエリを作成しようとしていますそれは関連する質問を「生産」するだろう。 2.持って、少なくとも2つ以上の同じキーワードを設定すると、これらの2では、同じカテゴリに属する​​

を 1:私は自分のページ上のある特定の質問を表示しています、と私は怒鳴るという質問だけを表示したいです変数私は、表示された質問のカテゴリとキーワードを保持しています。これからは、「関連する」質問を表示するクエリを作成したいと思います。

$keywordsInQurrentQuestion (array that holds the keywords) 
$questioncategoryID (category of the question) 

私のような何かをしようとしています:私は、少なくとも2つの同じキーワードをチェックしたいので、どこが句で配列を使用する方法について

SELECT * 
    FROM question WHERE `questionstatusID` = 5 
    AND questioncategoryID = $questioncategoryID 
    // I have no idea how to check if the question have at least 2 keywords that exists in the $keywordsInQurrentQuestion array 
    "); 

私が見つけた答えは、これらの答えは有用ではありません私に。

+0

質問を明確にするサンプル入力と出力を提供します –

+0

入力または出力を提供する必要があるかどうかわかりません。オレンジ、リンゴ、イチゴ、チェリー、スイカ、レモン、ブドウ、ココナッツ、マンゴー、アボカドのようなキーワードがあります。 Array $ keywordsInQurrentQuestionには、オレンジ、リンゴ、モーターオイル、オリーブオイルが含まれています。 – user2417624

+0

私はあなたのテーブルデータについて言いました。 –

答えて

1

データベーススキーマは、実際にはそのような種類のクエリでは作成されていません。結局、MySQLはリレーショナルデータベースです。 MySQLで

ソリューション(必要なDBスキーマの変更)

ちょうどキーワード(またはメタタグ)のための余分なテーブルを持っている方が良いでしょう:

ID  tag 
    1  oranges 
    2  apples 
...  ... 
154  motor oil 

秒台でしょうその後、質問とタグの関係を維持してください:

questionID tagID 
    1   1 
    1   2 
    1   37 
    2   3 
...  ... 
18  102 
19  154 

類似した/関連する質問を検索する際は、同じタグの最小値を確認してください。

SELECT DISTINCT(r1.questionID) 
FROM relation r1 
INNER JOIN relation r2 
    ON r1.questionID = r2.questionID AND NOT r1.tagID = r2.tagID 
WHERE r1.tagID IN (SELECT tagID FROM relations WHERE questionID = 123) 
    AND r2.tagID IN (SELECT tagID FROM relations WHERE questionID = 123) 

このクエリは、関係テーブルを結合します。これは、同様の質問を取得し、実際のクエリで使用されます

SELECT tagID FROM relations WHERE questionID = 123; 

:まず、副問合せは、あなたの表示された質問からすべてのタグを取得するために使用されます同一の質問IDを持ち、異なるタグIDを持つ行を探しています(selfjoin)。 WHERE句では、両方の結合タグが元の質問のセット内にあるかどうかを確認します。最後に、すべての重複(DISTINCT)が削除され、関連する質問IDのリストが表示されます。

このクエリはカテゴリを確認するためにまだ拡張する必要がありますが、これはステートメントをクリアするために省略されています。PHPで

ソリューション

あなたのコメントによると、あなたは、DBスキーマを変更する必要はありません。データベースからすべての質問を最初に取得し、PHPで関連するものを取得することは、実行時間とパフォーマンスの面で最良の選択肢ではないかもしれませんが、それでも可能です。

あなたには、いくつかの値

$meta_tags = "oranges,apples,avocados,olive oil"; 

と、少なくとも質問IDを含む配列内の同じカテゴリからのすべてのご質問や、それぞれのキーワードであなたの元の質問のすべての条項を持っていると仮定すると

$questions = array(
    0 => array(
    "questionID" => 1, 
    "metaTags" => "apples,olive oil", 
), 
    1 => array(
    "questionID" => 2, 
    "metaTags" => "oranges,motor oil", 
), 
    2 => array(
    "questionID" => 3, 
    "metaTags" => "oranges,avocados", 
), 
    ... 
); 

質問をループして、少なくとも2つのキーワードが同じであるかどうかを確認し、質問IDを配列に保存してください:

function check_tags($needles, $haystack) { 
    $original_tags = explode(',', $haystack); 
    $original_tags = array_map('trim', $original_tags); 
    $tags_to_check = explode(',', $needles); 
    $tags_to_check = array_map('trim', $tags_to_check); 
    $count = 0; 
    foreach ($tags_to_check as $t) { 
    if (in_array($t, $original_tags)) { 
     count++; 
    } 
    } 
    return $count; 
} 
$related = array(); 
foreach ($questions as $q) { 
    if (check_tags($q['metaTags'], $meta_tags) >= 2) { 
    $related[] = $q['questionID']; 
    } 
} 

配列$relatedには、元の質問に類似したすべての質問IDが含まれるようになりました。

+0

この段階では、追加、編集、削除を行うコードとテーブルを変更するのは面倒です。フィールド内で配列アイテムが何回見つかったのかを数え、その結果に2つ以上のレコードしか含まないことを期待したいと思いました。どういうわけか、これはいくつかのPHPのループで行うことができますか? – user2417624

関連する問題