100 个 XRP 求个比较复杂的 MySQL 问题答案

2014-04-22 22:19:13 +08:00
 default
团队比赛结果表:
ID------赢家ID------输家ID------平局标志-----比赛时间
主键 索引 索引

团队表
ID------团队名字-----玩家ID
主键 索引


玩家表
ID-----玩家名字-----玩家微博ID
主键 索引


玩家好友表
玩家ID----好友微博ID
主键 主键

一个玩家允许创建多个团队,一个团队可以多次比赛。
现在想查出
1.玩家+玩家好友的比赛记录。按照比赛ID降序

2.玩家好友的比赛记录

貌似有点难度,不知道怎么写了。。。。
要能用上索引
2648 次点击
所在节点    问与答
6 条回复
fox
2014-04-22 23:01:18 +08:00
XRP这个功能不错……悬赏任务。。
explon
2014-04-22 23:45:08 +08:00
目前价值三块
aqqwiyth
2014-04-23 00:11:33 +08:00
-- 数据不大的情况,直接用or查询解决问题 or不走索引
SELECT bs.* from 比赛记录 bs INNER join (
-- 根据玩家获取团队id去重
SELECT DISTINCT(t.id) id from 团队 t INNER join (
-- 找出玩家与玩家好友的玩家id
SELECT DISTINCT (a.id) id from 玩家 a left join 好友 b on a.`微博ID` = b.`好友微博ID`
where b.玩家id = 1 or a.id =1

) wj on t.玩家id = wj.id
) t on bs.赢家ID = t.id or bs.输家ID= t.id
ORDER BY bs.id desc;




-- ———————————— 使用 UNION合并来 优化 or 查询————————————————————
SELECT * from (
-- 获取赢了的比赛
SELECT bs.* from 比赛记录 bs INNER join (
-- 根据玩家获取团队id去重
SELECT DISTINCT(t.id) id from 团队 t INNER join (
-- 获取所有好友的id,UNION上这个玩家的id
SELECT a.id from 玩家 a where exists(select 1 from 好友 b where b.玩家id= 1 and a.`微博ID` = b.`好友微博ID`)
UNION select 1
) wj on t.玩家id = wj.id
) t on bs.赢家ID = t.id
UNION
-- 输了的比赛
SELECT bs.* from 比赛记录 bs INNER join (
-- 根据玩家获取团队id去重
SELECT DISTINCT(t.id) id from 团队 t INNER join (
-- 获取所有好友的id,UNION上这个玩家的id
SELECT a.id from 玩家 a where exists(select 1 from 好友 b where b.玩家id= 1 and a.`微博ID` = b.`好友微博ID`) UNION select 1
) wj on t.玩家id = wj.id
) t on bs.输家ID = t.id
) 比赛记录 order by id desc


不弄了碎觉去了。。。
aqqwiyth
2014-04-23 00:13:34 +08:00
b.玩家id= 1 与
UNION select 1
1为玩家的ID

如果只查询好友的比赛 注释掉UNION select 1 即可
default
2014-04-23 21:25:27 +08:00
@aqqwiyth 多谢,请留下ripple 地址
aqqwiyth
2014-04-23 22:22:22 +08:00
@default 没搞过这些,LZ留个有缘人:)

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/109598

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX