0

大家好

我真的需要你的帮助。我必须获得所有用户的列表(不同的): - 在比赛中进行实时签到( checkins.ctype = 'live' ) - 他们最喜欢的球队(参见 fanusers_teams ) - 以 3 个或更多的进球差获胜。

最喜欢的球队,可能是 info_matches.team_id1 或 info_matches.team_id2 或两者兼而有之。

这是相关表格的一个小设计:

设计

我尝试过的方法有效率为 80%(所以它不会 :( ),因为它返回了一些正确的用户(他们最喜欢的团队有 3 个以上的目标差异),但也返回了没有最喜欢的团队的用户我认为他们被退回是因为他们已经为一场比赛进行了现场签到,其中一支球队或另一支球队以 3+ 的进球差异获胜。

这是我的查询:

选择不同的
    f.id
从
    粉丝f
左连接
    签入 c ON f.id = c.fanuser_id
左连接
    info_matches m ON m.id = c.match_id
在哪里
    c.ctype = 'live' 和
(
        m.team_id1 IN(
                选择不同的
                    m1.team_id1
                从
                    info_matches m1
                正确加入
                                        fanusers_teams ft ON m1.team_id1 = ft.team_id
                正确加入
                                        fanusers f ON f.id = ft.fanuser_id
                在哪里
                    m1.pointsteam1 - m1.pointsteam2 >= 3
                  )
        或者

        m.team_id2 IN(
                选择不同的
                    m2.team_id2
                    从
                    info_matches m2
                正确加入
                                        fanusers_teams ft ON m2.team_id2 = ft.team_id
                正确加入
                                        fanusers f ON f.id = ft.fanuser_id
                在哪里
                    m2.pointsteam2 - m2.pointsteam1 >= 3
                  )
)

如果有人成功解决了这个查询,我也会感谢我做错了什么。

谢谢。

4

2 回答 2

3

像这样的东西应该工作:

SELECT  DISTINCT f.id 

FROM    fanusers f 

        JOIN checkins c 
        ON f.id = c.fanuser_id 

        JOIN fanusers_teams ft
        ON f.id = ft.fanuser_id

        JOIN info_matches m 
        ON m.id = c.match_id 
        AND 
        (
            (ft.team_id = m.team_id1 AND pointsteam1 - pointsteam2 >= 3) 
        OR 
            (ft.team_id = m.team_id2 AND pointsteam2 - pointsteam1 >= 3)
        )

WHERE   c.ctype = 'live'
于 2012-12-11T15:36:44.457 回答
0

我还找到了一种解决查询的方法,但不如 Tom 做的那么好。

我的方式 :

选择不同的
                            f.id AS user_id
                        从
                            粉丝f
                        左连接
                            签入 c ON f.id = c.fanuser_id
                        左连接
                            info_matches m ON m.id = c.match_id
                        在哪里
                            c.ctype = '直播'
                            和
                            m.matchisfinished = 1
                            和
                            c.fanuser_id 不在(SELECT DISTINCT
                                                                            f1.id
                                                                        从
                                                                            粉丝f1
                                                                        左连接
                                                                            fanusers_stickers fs
                                                                        开 f1.id = fs.fanuser_id
                                                                        在哪里
                                                                            fs.sticker_id = 35
                                                                    )
                            和
                            (
                                ( m.team_id1 IN ( SELECT DISTINCT
                                                                                ft.team_id
                                                                            从
                                                                                fanusers_teams 英尺
                                                                            内部联接
                                                                                签到 c1
                                                                            上
                                                                                ft.fanuser_id = c1.fanuser_id
                                                                            在哪里
                                                                                f.id = c1.fanuser_id
                                                                    )
                                        和
                                        m.pointsteam1-m.pointsteam2>=3
                                    )

                                    或者

                                    (
                                         m.team_id2 IN(选择不同的
                                                                                    ft.team_id
                                                                                从
                                                                                    fanusers_teams 英尺
                                                                                内部联接
                                                                                    签到 c1
                                                                                上
                                                                                    ft.fanuser_id = c1.fanuser_id
                                                                                在哪里
                                                                                    f.id = c1.fanuser_id
                                                                        )
                                            和
                                            m.pointsteam2-m.pointsteam1>=3
                                    )
                            )

所以目前,即使我很高兴自己解决了查询,我也会使用汤姆的查询:)。

于 2012-12-11T16:05:35.463 回答