1

好的,所以我在 MySQL 中有这两个表。一种称为“历史”,一种称为“注释”。

“历史”表充满了可以重复的随机 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

那是因为您的 History 表中有重复项,因此服务器会为每个表返回一个描述。尝试在 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_1。注意Vvs. v_

MySQL 的字符串比较默认情况下不区分大小写,因此当您在查询中进行联接时,该History.Videoid_1值将匹配Annotated.videoid_1AND Annotaded.Videoid_1,本质上是重复您的结果。

如果您确实打算使用这些混合大小写的标识符,则需要强制进行二进制比较,这使其区分大小写:

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

或将您的两个表切换为区分大小写的排序规则。

于 2012-09-05T18:53:52.397 回答
0

每个 videoid 都有多行,因为 History 中的每个 videoid 都有多行。但问题是,您的查询中似乎不需要历史记录中的任何信息。你可以只查询 Annotated 而不加入任何其他表,所以我不确定你为什么加入 History。它具有的唯一效果是您观察到的效果,即行是重复的。

于 2012-09-05T18:59:07.857 回答