Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php mysql查询返回多个值-应返回一个_Php_Mysql_Duplicates - Fatal编程技术网

Php mysql查询返回多个值-应返回一个

Php mysql查询返回多个值-应返回一个,php,mysql,duplicates,Php,Mysql,Duplicates,我有一个网站,访问者可以在这里创建“战斗”并上传视频,在这些战斗中竞争 下面的mySQL查询试图检索数据库中每个“战斗”的详细信息 我的问题是,如果一个“战斗创造者”将两个“视频”上传到同一场战斗中,就会打印出一个重复的战斗 即使视频表中有两个条目位于同一个battle_id下,如何使查询仅为每个battle打印一个值 谢谢 SELECT * from Battles, Player, Video WHERE (Battles.battle_creator = Player.player_id

我有一个网站,访问者可以在这里创建“战斗”并上传视频,在这些战斗中竞争

下面的mySQL查询试图检索数据库中每个“战斗”的详细信息

我的问题是,如果一个“战斗创造者”将两个“视频”上传到同一场战斗中,就会打印出一个重复的战斗

即使视频表中有两个条目位于同一个battle_id下,如何使查询仅为每个battle打印一个值

谢谢

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)来管理工作;我知道它必须是一个查询,但这只是我的一个假设。感谢您的回答-第二个查询看起来非常复杂,所以我选择使用两个简单的查询来获得结果