如何从MySQL 5.5中获取工作查询以在MySQL 5.7中工作?

如何从MySQL 5.5中获取工作查询以在MySQL 5.7中工作?,mysql,subquery,sql-order-by,mysql-5.5,mysql-5.7,Mysql,Subquery,Sql Order By,Mysql 5.5,Mysql 5.7,我花了很多很多时间试图弄明白这一点。所以我的查询在不同的mysql版本上给出了不同的结果。这导致了我的问题。到目前为止,我已经发现,由于MySQL 5.6,order by in子查询无法识别。这似乎就是5.7中错误结果的原因 我想我应该以不同的方式开始和存在,但我不知道如何结束 我已经在3台不同的服务器上使用相同的数据库对此进行了测试。一个5.5有效,两个5.7无效 我的查询:有效:5.5,无效:5.6,5.7 SELECT Sum(P) as games FROM(SELECT gamed

我花了很多很多时间试图弄明白这一点。所以我的查询在不同的mysql版本上给出了不同的结果。这导致了我的问题。到目前为止,我已经发现,由于MySQL 5.6,order by in子查询无法识别。这似乎就是5.7中错误结果的原因

我想我应该以不同的方式开始和存在,但我不知道如何结束

我已经在3台不同的服务器上使用相同的数据库对此进行了测试。一个5.5有效,两个5.7无效

我的查询:有效:5.5,无效:5.6,5.7

SELECT
Sum(P) as games 
FROM(SELECT gameday, league, home, season, id, 1 P
FROM games
UNION ALL
SELECT gameday, league, away, season, id, 1
FROM games) as tot, clubs c WHERE tot.home=c.id AND c.id=1 AND
tot.league<=2 AND tot.season=2010 
AND EXISTS
(select if(e.event<10,1,0) as first from 
(select * from events 
where event<=2 or event=9 or event=10 or event=11 or event=13 
order by event_time asc) as e 
where e.game=tot.id group by e.game having first>0)

最终我自己成功了。这是我现在使用的

SELECT
Sum(P) as games 
FROM(SELECT gameday, league, home, season, id, 1 P 
FROM games
UNION ALL
SELECT gameday, league, away, season, id, 1
FROM games) as tot, clubs c WHERE tot.home=c.id AND c.id=1 AND
tot.league<=2 AND tot.season=2010 
AND EXISTS
(select if(e.event<10,1,0) as first from 
(select game, min(event_time), 
substring_index(group_concat(event order by event_time), ',', 1) as event 
from events 
where event<=2 or event=9 or event=10 or event=11 or event=13 
group by game) as e 
where e.game=tot.id having first>0)

您的第一个目标是从每场比赛中找到第一个合格的事件。限定是指具有您提到的事件值之一。这里有一个很好的技巧。每场比赛编号最低的事件是第一个事件

这就是你想要的。这是第一个合格事件的ID/游戏列表

             SELECT MIN(id) id, game
               FROM events
              WHERE event < 2
                 OR event IN (9,10,11,13)
              GROUP BY game
接下来,您需要每个游戏的实际第一个事件,而不仅仅是它的id

      SELECT a.event, a.game
        FROM event a
        JOIN (
               SELECT MIN(id) id, game
                 FROM events
                GROUP BY game
             ) b ON a.id = b.id
       WHERE a.event < 10
这将生成每个游戏的第一个事件的事件/游戏列表,但不包括第一个事件值>=10的游戏

接下来,你已经正确地列出了一份主客场比赛的联盟名单。此查询为每个游戏生成一行

       SELECT tot.p
         FROM (
               SELECT gameday, league, home, season, id, 1 AS p FROM games
                UNION ALL
               SELECT gameday, league, away, season, id, 1 AS p FROM games
              ) tot
         JOIN clubs c ON tot.home = c.id
        WHERE tot.league <= 2
          AND tot.season >= 2010
          AND c.id = 1
最后,当第一个事件<10时,加入您选择的游戏,并将结果相加

SELECT SUM(tot.p) gamecount
  FROM (
        SELECT gameday, league, home, season, id, 1 AS p FROM games
         UNION ALL
        SELECT gameday, league, away, season, id, 1 AS p FROM games
       ) tot
  JOIN clubs c ON tot.home = c.id
  JOIN (
          SELECT a.event, a.game
            FROM event a
            JOIN (
                   SELECT MIN(id) id, game
                     FROM events
                    GROUP BY game
                 ) b ON a.id = b.id
           WHERE a.event < 10
       ) eligible ON eligible.game = tot.id
 WHERE tot.league <= 2
   AND tot.season >= 2010
   AND c.id = 1
我写这篇文章的目的是展示SQL中的S结构。从简单的构建块开始构建查询可以得到两件事

正确答案 一种调试方法,运行子查询,确保它们工作,然后将它们合并到更大的查询中。
当你说不行的时候,你能更具体一点吗?你能解释一下你想做什么吗?您误用了MySQL对GROUPBY的非标准扩展。这意味着MySQL服务器可以自由选择出现在您的ife.event中的e.event值,而这个被诅咒的扩展声称是另一个受害者。抱怨。谢谢你@OllieJones花时间。我知道我不正确地使用了group by,但正如我所说,这就像我希望它在5.5中工作一样。但现在我正在寻找另一种方法来做到这一点,而不滥用分组。我在这里编辑了我的问题,关于我想要达到的目标。如果你能看一下并给我指出一些方向,那就太棒了:不幸的是,你的查询在任何给定版本的MySQL中都能正常工作,这只是随机的运气。我理解。你知道如何用另一种方法来做这件事并得到想要的结果吗?谢谢,回答得很好。但就我而言,这并不能给出正确的答案。因为在events表中,游戏的第一个事件并不总是具有最低的id。但无论如何,感谢您解释如何最好地构建查询。我很感激!
SELECT SUM(tot.p) gamecount
  FROM (
        SELECT gameday, league, home, season, id, 1 AS p FROM games
         UNION ALL
        SELECT gameday, league, away, season, id, 1 AS p FROM games
       ) tot
  JOIN clubs c ON tot.home = c.id
  JOIN (
          SELECT a.event, a.game
            FROM event a
            JOIN (
                   SELECT MIN(id) id, game
                     FROM events
                    GROUP BY game
                 ) b ON a.id = b.id
           WHERE a.event < 10
       ) eligible ON eligible.game = tot.id
 WHERE tot.league <= 2
   AND tot.season >= 2010
   AND c.id = 1