V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
default
V2EX  ›  问与答

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

  •  
  •   default · 2014-04-22 22:19:13 +08:00 · 2634 次点击
    这是一个创建于 3659 天前的主题,其中的信息可能已经有所发展或是发生改变。
    团队比赛结果表:
    ID------赢家ID------输家ID------平局标志-----比赛时间
    主键 索引 索引

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


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


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

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

    2.玩家好友的比赛记录

    貌似有点难度,不知道怎么写了。。。。
    要能用上索引
    6 条回复    1970-01-01 08:00:00 +08:00
    fox
        1
    fox  
       2014-04-22 23:01:18 +08:00
    XRP这个功能不错……悬赏任务。。
    explon
        2
    explon  
       2014-04-22 23:45:08 +08:00 via iPhone
    目前价值三块
    aqqwiyth
        3
    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
        4
    aqqwiyth  
       2014-04-23 00:13:34 +08:00
    b.玩家id= 1 与
    UNION select 1
    1为玩家的ID

    如果只查询好友的比赛 注释掉UNION select 1 即可
    default
        5
    default  
    OP
       2014-04-23 21:25:27 +08:00
    @aqqwiyth 多谢,请留下ripple 地址
    aqqwiyth
        6
    aqqwiyth  
       2014-04-23 22:22:22 +08:00
    @default 没搞过这些,LZ留个有缘人:)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   1002 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 22:10 · PVG 06:10 · LAX 15:10 · JFK 18:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.