我有一个网站,访问者可以创建“战斗”并上传视频以参加这些战斗。
以下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;
答案 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。