【问题标题】:Complex mysql query probably build subquery复杂的mysql查询可能会构建子查询
【发布时间】:2013-08-06 11:34:30
【问题描述】:

就我而言,我有来自多个表的数据,我想提取一个查询。这是关于足球数据的。在一分钟的表格中记录了比赛的日期以及其他记录的比赛数据和结果。 问题是我想限制日期的应用,而不是比赛的数量,因为一天有几场比赛。 设法建立了一个复杂的查询来显示我的所有数据,但它显示的结果是游戏数量而不是日期,所以我不能使用限制,因为在这种情况下吃东西会变成更多游戏而不是日期。 我的问题是是否可以构建一个对日期有限制的应用程序,同时显示日期内所有比赛的结果? 这是我现在使用的应用程序的代码:

SELECT
            MAIN.id,
            SECTION.type,
            MAIN.date as date_,
            MAIN.prognosis,
            HOME_TEAM.team_name as home_team,
            GUEST_TEAM.team_name as guest_team,
            FIRST_INDEX.index as f_index,
            SECOND_INDEX.index as s_index,
            THIRD_INDEX.index as t_index,
            DATA.home_result,
            DATA.guest_result,
            DATA.coefficient,
            DATA.success,
            MAIN.total_coefficient,
            MAIN.total_success

        FROM ssdt_matches_main as MAIN

        LEFT JOIN ssdt_section_type as SECTION ON (MAIN.type_id = SECTION.id)
        LEFT JOIN ssdt_matches_data as DATA ON (DATA.matches_main_id = MAIN.id )
        LEFT JOIN ssdt_matches_teams as HOME_TEAM ON (HOME_TEAM.id = DATA.home_team_id )
        LEFT JOIN ssdt_matches_teams as GUEST_TEAM ON (GUEST_TEAM.id = DATA.guest_team_id )
        LEFT JOIN ssdt_matches_index as FIRST_INDEX ON (FIRST_INDEX.id = DATA.first_index_id )
        LEFT JOIN ssdt_matches_index as SECOND_INDEX ON (SECOND_INDEX.id = DATA.second_index_id )
        LEFT JOIN ssdt_matches_index as THIRD_INDEX ON (THIRD_INDEX.id = DATA.third_index_id ) 


        WHERE SECTION.type = 'Risk prognosis'


        ORDER BY MAIN.id DESC

【问题讨论】:

    标签: mysql subquery limit


    【解决方案1】:

    您想限制 where 子句中的日期,例如:

    where MAIN.date between date('2012-01-01') and date('2012-12-31');
    

    如果您想获取最近 10 天的记录(有匹配项),您可以执行以下操作:

    select . . .
    from . . . join
         (select date
          from ssdt_matches_main md
          group by date
          order by date desc
          limit 10
         ) datel
         on datel.date = MAIN.date
    

    这使用连接来选择日期列表,然后使用连接进行过滤。

    编辑:

    您的 from 子句如下所示:

        FROM ssdt_matches_main as MAIN
    
        LEFT JOIN ssdt_section_type as SECTION ON (MAIN.type_id = SECTION.id)
        LEFT JOIN ssdt_matches_data as DATA ON (DATA.matches_main_id = MAIN.id )
        LEFT JOIN ssdt_matches_teams as HOME_TEAM ON (HOME_TEAM.id = DATA.home_team_id )
        LEFT JOIN ssdt_matches_teams as GUEST_TEAM ON (GUEST_TEAM.id = DATA.guest_team_id )
        LEFT JOIN ssdt_matches_index as FIRST_INDEX ON (FIRST_INDEX.id = DATA.first_index_id )
        LEFT JOIN ssdt_matches_index as SECOND_INDEX ON (SECOND_INDEX.id = DATA.second_index_id )
        LEFT JOIN ssdt_matches_index as THIRD_INDEX ON (THIRD_INDEX.id = DATA.third_index_id ) 
        join (select date
              from ssdt_matches_main md
              group by date
              order by date desc
              limit 10
             ) datel
             on datel.date = MAIN.date
    

    【讨论】:

    • 我想限制日期数量的数据,而不是日期从-到。类似于 LIMIT 0,50
    • @user2656529 。 . .如果您想限制给定的日期数,那么第二个版本应该可以工作。
    • 我想我理解我提出的解决方案的逻辑。我会尝试返回结果。我不明白在哪里插入这个 JOIN 以及其他人留在哪里。这是有点困惑的地方......我没有做过子查询
    • 这不起作用,也没有给我预期的结果。我注意到的第一件事是日期字段不在此表“ssdt_matches_data”中,而是在另一个表“ssdt_matches_main”中。它的方式是,我希望要排序的框是 ID 字段而不是日期字段。我无法让它正常工作
    • @user2656529 。 . .您可以编辑您的问题以提供示例数据和所需的结果吗?我可能没有正确理解这个问题。
    【解决方案2】:

    我修复了查询。 没有你的帮助,我不会这样做。 非常感谢!

    SELECT
                MAIN.id,
                SECTION.type,
                MAIN.date as date_,
                MAIN.prognosis,
                HOME_TEAM.team_name as home_team,
                GUEST_TEAM.team_name as guest_team,
                FIRST_INDEX.index as f_index,
                SECOND_INDEX.index as s_index,
                THIRD_INDEX.index as t_index,
                DATA.home_result,
                DATA.guest_result,
                DATA.coefficient,
                DATA.success,
                MAIN.total_coefficient,
                MAIN.total_success
    
            FROM ssdt_matches_main as MAIN
    
    LEFT JOIN ssdt_section_type as SECTION ON (MAIN.type_id = SECTION.id)
    LEFT JOIN ssdt_matches_data as DATA ON (DATA.matches_main_id = MAIN.id )
    LEFT JOIN ssdt_matches_teams as HOME_TEAM ON (HOME_TEAM.id = DATA.home_team_id )
    LEFT JOIN ssdt_matches_teams as GUEST_TEAM ON (GUEST_TEAM.id = DATA.guest_team_id )
    LEFT JOIN ssdt_matches_index as FIRST_INDEX ON (FIRST_INDEX.id = DATA.first_index_id )
    LEFT JOIN ssdt_matches_index as SECOND_INDEX ON (SECOND_INDEX.id = DATA.second_index_id )
    LEFT JOIN ssdt_matches_index as THIRD_INDEX ON (THIRD_INDEX.id = DATA.third_index_id ) 
    JOIN (SELECT id
          FROM ssdt_matches_main md
          WHERE type_id = 2
          ORDER BY id DESC
          LIMIT 0,5
         ) datel
         ON datel.id = DATA.matches_main_id
    
    
            ORDER BY MAIN.id DESC
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多