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

时间:2012-10-20 20:39:11

标签: php mysql duplicates

我有一个网站,访问者可以创建“战斗”并上传视频以参加这些战斗。

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

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

如果视频表在同一个battle_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;

4 个答案:

答案 0 :(得分:1)

单个用户将多个视频分配给一个战斗后,无法从单个查询中获取您要求的信息。

获取战斗所有数据的最佳方法是将查询分成两个子查询:

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;

第一个查询每次战斗会给你一行;第二个将为您提供所有战斗的所有视频,您可以迭代。

从缩放的角度来看,你最好完全避免加入JOIN,所以额外的工作是值得的。

答案 1 :(得分:0)

您可以在查询中添加LIMIT 1子句以仅获取第一个结果,或者使用DISTINCT子句,如

SELECT DISTINCT *
FROM ...

那就是说,查询多个表时不应该使用“SELECT *” - 使用“SELECT table。*”或“SELECT table.field1,table.field2,...”更具体。

答案 2 :(得分:0)

你不能“完全”这样做,因为你的查询:

SELECT * from Battles, Player, Video  ...

隐含地要求所有视频。所以你需要先问自己,如何选择我想要的那个视频?

如果您只想要一个视频,那么请将LIMIT 1添加到查询中并完成该操作。在ORDER BY之前LIMIT video_date 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;

在上面的示例中,我使用“视频选择标准”,“视频最小的视频”。你需要在(Video.video_id)上有一个索引,比如

CREATE INDEX video_ndx ON Video(player_id, battle_id, video_id);

答案 3 :(得分:-1)

正如Ninsuo的评论指出的那样,控制它的正确方法是在ORDER BY子句之后指定LIMIT 1。

如果你想要整个表,这将无效,只是没有重复。考虑对返回的数据运行一些比较检查,或使用SELECT DISTINCT。