2011-06-29 21 views
0

私は2つのテーブルを持っています。 1つはビデオ情報を格納し、もう1つはそのビデオに関連付けられたタグを格納します。彼らは共通のフィールドvid_idを共有します。私はマッチのために両方のテーブルをフルテキスト検索しようとしています。目標はどちらかのテーブルに一致がある場合、そのvid_idを持つすべてのフィールドがビデオから集められることです。全文検索2テーブル

問題は私のクエリがちょうどCall to undefined method PDOConnectionFactory::errorInfo()でクラッシュすることです。 nameフィールドがtestのタグに1つのエントリがあるので、1行を返す必要があります。誰でもアイデアはありますか?私はしばらくこのことに苦労してきました。

CREATE TABLE IF NOT EXISTS `tags` (
    `id` varchar(35) NOT NULL, 
    `vid_id` varchar(35) NOT NULL, 
    `name` varchar(45) CHARACTER SET utf8 COLLATE utf8_bin NOT NULL, 
    UNIQUE KEY `vid_id` (`vid_id`,`name`), 
    FULLTEXT KEY `name` (`name`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

CREATE TABLE IF NOT EXISTS `video` (
    `timestamp` int(11) NOT NULL, 
    `vid_id` varchar(32) NOT NULL, 
    `file_name` varchar(32) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `uploader` varchar(55) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `title` varchar(30) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL, 
    `subject_id` int(1) NOT NULL, 
    FULLTEXT KEY `title` (`title`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

$sql = "SELECT video.* 
    MATCH(video.title) AGAINST('?') as cscore, 
    MATCH(tags.name) AGAINST('?') as htscore 
FROM video 
LEFT JOIN tags ON video.vid_id=tags.vid_id 
WHERE 
    MATCH(video.title) AGAINST('?') OR 
    MATCH(tags.name) AGAINST('?') 
ORDER BY cscore DESC;"; 
$stmt4 = $conn->prepare($sql); 
$result=$stmt4->execute(array('test','test','test','test')) or die(print_r($db->errorInfo(), true)); 
+1

はおそらく、あなたが 'ますprint_r($ conn->のerrorInfo())'意味? – thetaiko

+0

これはArray([0] => 00000 [1] => [2] =>)によって返されます。まだクエリ結果はありません。それは笑を意味するものですか? – Scarface

+0

"準備"の前にこれを追加してください: '$ conn-> setAttribute(PDO :: ATTR_ERRMODE、PDO :: ERRMODE_WARNING);'そしてもう一度やり直してください – thetaiko

答えて

1

問題は、あなたのSQLクエリのSELECT video.*後にコンマ(、)を逃しているということです。

の作業例:

SELECT video.*, 
    MATCH(video.title) AGAINST('?') as cscore, 
    MATCH(tags.name) AGAINST('?') as htscore 
FROM video 
LEFT JOIN tags ON video.vid_id=tags.vid_id 
WHERE 
    MATCH(video.title) AGAINST('?') OR 
    MATCH(tags.name) AGAINST('?') 
ORDER BY cscore DESC; 
+0

HEY!フランソワは入力を感謝します。エラーはなくなりましたが、結果は得られませんでした。あなたはそれがなぜあるのか知っていますか?私はvideo.titleの名前を照会しようとしましたが、私も運がないtags.nameに存在する名前を試しました... – Scarface

+0

Nvmブールモードで検索しています。ここですべてのキンクについてhttp:// devを読んでいます。 mysql.com/doc/refman/5.0/en/fulltext-natural-language.html。 – Scarface

+0

@Scarface - 申し訳ありません。私は映画を見に行く。あなたがそれを理解したことを聞いてうれしいです。 –