Php mysql查询返回多个值-应返回一个
我有一个网站,访问者可以在这里创建“战斗”并上传视频,在这些战斗中竞争 下面的mySQL查询试图检索数据库中每个“战斗”的详细信息 我的问题是,如果一个“战斗创造者”将两个“视频”上传到同一场战斗中,就会打印出一个重复的战斗 即使视频表中有两个条目位于同一个battle_id下,如何使查询仅为每个battle打印一个值 谢谢Php mysql查询返回多个值-应返回一个,php,mysql,duplicates,Php,Mysql,Duplicates,我有一个网站,访问者可以在这里创建“战斗”并上传视频,在这些战斗中竞争 下面的mySQL查询试图检索数据库中每个“战斗”的详细信息 我的问题是,如果一个“战斗创造者”将两个“视频”上传到同一场战斗中,就会打印出一个重复的战斗 即使视频表中有两个条目位于同一个battle_id下,如何使查询仅为每个battle打印一个值 谢谢 SELECT * from Battles, Player, Video WHERE (Battles.battle_creator = Player.player_id
SELECT * from Battles, Player, Video
WHERE (Battles.battle_creator = Player.player_id
AND Battles.battle_id = Video.battle_id
AND Video.player_id = Battles.battle_creator)
ORDER BY Battles.battle_date DESC;
正如Ninsuo的评论所指出的,控制这种情况的正确方法是,在ORDER BY子句之后,指定限制1
如果您想要整个表,而不需要重复项,那么这将不起作用。考虑在返回的数据上运行一些比较检查,或者使用SELECT DISPLATION.< P>您可以将限制1子句添加到查询中以获得第一个结果,或者使用不同的子句,如
SELECT DISTINCT *
FROM ...
也就是说,查询多个表时不应使用“SELECT*”-
更具体地说,请使用“选择表。*”或“选择表.field1,表.field2,…”。一旦一个用户将多个视频分配给一场战斗,就无法从一个查询中获取所需的信息 获取战斗所有数据的最佳方法是将查询分为两个子查询:
SELECT * from Battles, Player
WHERE Battles.battle_creator = Player.player_id
ORDER BY Battles.battle_date DESC;
…然后:
SELECT * from Video
ORDER BY Battles.battle_date DESC, Player.player_id;
第一个查询将为您提供每场战斗一行;第二个将为您提供所有战斗的所有视频,您可以对其进行迭代
从缩放角度来看,您最好完全避免连接,因此额外的工作是值得的。您不能“准确地”做到这一点,因为您的查询:
SELECT * from Battles, Player, Video ...
暗中要求所有的视频。所以你需要先问问自己,我该如何选择我想要的视频
如果您只需要一个视频,那么将LIMIT 1
添加到查询中并完成该操作<代码>按video\u日期ASC或DESC在限制之前排序
以检索最早或最新的视频
否则,您必须执行以下操作:
SELECT * from Battles
JOIN Player ON (Battles.battle_creator = Player.player_id)
JOIN Video ON (Battles.battle_id = Video.battle_id
AND Video.player_id = Battles.battle_creator)
WHERE Video.video_id = (SELECT MIN(video_id) FROM Video AS Video2 WHERE
Battles.battle_id = Video2.battle_id
AND Video2.player_id = Battles.battle_creator)
ORDER BY Battles.battle_date DESC;
在上面的例子中,我使用“视频选择标准”,“视频id最小的视频”。你需要在(Video.Video\u id)上有一个索引,比如
CREATE INDEX video_ndx ON Video(player_id, battle_id, video_id);
你试过<代码>最后限制1嗨-我想检索数据库中的每一场战斗,所以我不想在这种情况下将其限制为一场战斗。问题是,当我回显战斗列表时,会出现一个重复的战斗,其中包含一个不同的视频,该视频由您正在使用“内部连接”的同一个“战斗创建者”制作。在使用
select*from…
时,您真的需要所有表中的所有字段吗?需要更多关于显示内容的信息。如果你想每一场战斗都显示一次,如果有多个视频,会发生什么?为什么要包含视频信息?是否显示每个视频的链接?如果有多个视频,您的业务规则是什么?显示最新的吗?显示第一个?我想你正在搜索DISTINCT
/DISTINCTROW
,可能是在一个子查询OFF中:你真的应该使用joinsThanks来响应nathan-我想可能是这样,但希望有一个非常简单的查询来完成这项工作(我对mysql的了解有限)。我会试一试的。很酷,很高兴它很有帮助。我讨厌对问题的“你做错了”回答,从可伸缩性的角度来看,最好避免同时查询多个表。在应用程序/服务层FTW使用简单查询并合并数据。试图构建单个查询来完成复杂的任务通常是一个陷阱。:)通过创建第二个查询(thanksGood call)来管理工作;我知道它必须是一个查询,但这只是我的一个假设。感谢您的回答-第二个查询看起来非常复杂,所以我选择使用两个简单的查询来获得结果