1

さて、MySQL にこれら 2 つのテーブルがあります。1 つは「履歴」と呼ばれ、もう 1 つは「注釈付き」と呼ばれます。

「履歴」テーブルには、繰り返すことができるランダムな YouTube ビデオ ID がいっぱいです。「注釈付き」テーブルには、各動画 ID の一意のコピーとその ID の説明が含まれています。次のようになります。

 History                            Annotated

 videoid                    videoid          description

 videoid_1                  videoid_1        descript_1
 videoid_1                  videoid_2        descript_2
 videoid_3                  videoid_3        descript_3
 videoid_2                  etc.             etc.
 videoid_3
 videoid_1
 etc.

履歴テーブル、重複、およびすべてから特定のビデオ ID のセットを出力しようとしています。それは非常に簡単です。問題は、それらの説明を横に印刷する必要があることです。

そのため、印刷したい履歴ビデオ ID の配列があり、それらの横に対応する説明を印刷する MySQL コマンドを作成しようとしていますが、正しく機能していません。これが私がこれまでに持っているものです:

$implodedIdVideo = the array of specific history video id's, imploded for MySQL

SELECT History.videoid, Annotated.description 
FROM History, Annotated 
WHERE History.videoid = Annotated.videoid 
AND History.videoid IN ($implodedIdVideo)
ORDER BY History.videoid DESC";

while($row = mysql_fetch_array($query)){
echo $row['videoid']. " : ". $row['description'];
echo "<br />";
}

上記のMySQLコマンドは機能しますが、10件ほどの結果が得られるはずですが、50件ほどになり、その理由がわかりません。誰かが私がやろうとしていることを理解してくれれば、私が間違っていることを認識できると思いますか?

4

3 に答える 3

1

これは、履歴テーブルに重複があるためです。サーバーはそれぞれの説明を返します。ORDER の前に GROUP BY History.videoid を追加してみてください。

完全なクエリは次のようになります。

SELECT 
    History.videoid, Annotated.description 
FROM 
    History, Annotated 
WHERE 
    History.videoid = Annotated.videoid 
AND 
    History.videoid IN ($implodedIdVideo)
GROUP BY 
    History.videoid
ORDER BY 
    History.videoid DESC";
于 2012-09-05T18:57:25.927 に答える
0

あなたのテーブルを考えると、あなたHistoryはいくつかのほぼ重複したレコードを持っているようです:videoid_1vs Videoid_1V対に注意してくださいv

MySQLの文字列比較では、デフォルトで大文字と小文字が区別されないため、クエリで結合を行うと、値はANDHistory.Videoid_1と一致し、基本的に結果が複製されます。Annotated.videoid_1Annotaded.Videoid_1

これらの大文字と小文字が混在する識別子を実際に使用する場合は、バイナリ比較を強制する必要があります。これにより、大文字と小文字が区別されます。

WHERE BINARY History.videoid = Annotated.videoid 
      ^^^^^^

または、2つのテーブルで大文字と小文字を区別する照合に切り替えます。

于 2012-09-05T18:53:52.397 に答える
0

History には各 videoid に対して複数の行があるため、各 videoid に対して複数の行を取得しています。ただし、クエリで History からの情報を必要としていないようです。他のテーブルに結合せずに Annotated を照会するだけでよいので、なぜ History に結合したのかわかりません。それが持つ唯一の効果は、行が複製されていることです。

于 2012-09-05T18:59:07.857 に答える