好的,我在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个,我不知道为什么。我希望如果有人理解我要做的事情,他们能够认出我做错了吗?
答案 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
。请注意V
与v
。
默认情况下,MySQL的字符串比较不区分大小写,因此当您在查询中加入时,History.Videoid_1
值将与Annotated.videoid_1
和Annotaded.Videoid_1
匹配,从根本上复制您的结果。< / p>
如果您确实打算拥有这些混合大小写标识符,那么您将需要强制进行二进制比较,这会使其区分大小写:
WHERE BINARY History.videoid = Annotated.videoid
^^^^^^
或将两个表切换为区分大小写的排序规则。
答案 2 :(得分:0)
您为每个videoid获取多行,因为历史记录中的每个videoid都有多行。但问题是,您在查询中似乎不需要历史记录中的任何信息。您可以在不加入任何其他表的情况下查询Annotated,因此我不确定您为何加入History。它唯一的影响就是你观察到的那些行是重复的。