如何从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如何从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
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