如何从两个不同的MySQL表中一起打印元素

时间:2012-09-05 18:49:18

标签: php mysql

好的,我在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个,我不知道为什么。我希望如果有人理解我要做的事情,他们能够认出我做错了吗?

3 个答案:

答案 0 :(得分: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";

答案 1 :(得分:0)

根据您的History表,您似乎有一些几乎重复的记录:videoid_1 v。 Videoid_1。请注意Vv

默认情况下,MySQL的字符串比较不区分大小写,因此当您在查询中加入时,History.Videoid_1值将与Annotated.videoid_1Annotaded.Videoid_1匹配,从根本上复制您的结果。< / p>

如果您确实打算拥有这些混合大小写标识符,那么您将需要强制进行二进制比较,这会使其区分大小写:

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

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

答案 2 :(得分:0)

您为每个videoid获取多行,因为历史记录中的每个videoid都有多行。但问题是,您在查询中似乎不需要历史记录中的任何信息。您可以在不加入任何其他表的情况下查询Annotated,因此我不确定您为何加入History。它唯一的影响就是你观察到的那些行是重复的。