【问题标题】:mySQL subquery with limits error带有限制错误的 mySQL 子查询
【发布时间】:2016-12-12 12:02:27
【问题描述】:

我有两个游戏部分,但我遇到了问题。什么时候在第一部分比赛我不想在第二部分再次显示她。 对于我正在使用的第一节中的表演游戏:

SELECT *,platform.platformName FROM games 
JOIN platform ON(platform.PlatformID=games.GamePlatform) 
WHERE GameDate <= NOW() AND GameSlide = 0 
GROUP BY GameName 
HAVING 1 
ORDER BY `games`.`GameDate` DESC LIMIT 8

对于第二节的表演游戏:

SELECT *,platform.platformName 
FROM games 
JOIN platform ON(platform.PlatformID=games.GamePlatform) 
WHERE platform.PlatformID = 2 AND GameSlide = 0 
GROUP BY GameName 
HAVING 1 
order by rand(dayofyear(CURRENT_DATE)) 
LIMIT 8

我试着做这样的子查询:

SELECT *,platform.platformName 
FROM games 
JOIN platform ON(platform.PlatformID=games.GamePlatform) 
WHERE games.GameID 
NOT IN(
       SELECT GameID 
       FROM games 
       WHERE GameDate <= NOW() AND GameSlide = 0 
       GROUP BY GameName 
       HAVING 1 
       ORDER BY `games`.`GameDate` DESC LIMIT 8
      ) AND platform.PlatformID = 2 AND GameSlide = 0 
GROUP BY GameName 
HAVING 1 
order by rand(dayofyear(CURRENT_DATE)) LIMIT 8

但是 MySQL 调用错误:#1235 - This version of MariaDB doesn't yet support 'LIMIT &amp; IN/ALL/ANY/SOME subquery'

你能帮帮我吗? 对不起我的英语。我尽力了。

【问题讨论】:

  • 即使这确实有效,ORDER BY GameDate DESC LIMIT 8' 不一定会在子查询中为您提供与第 1 节查询中相同的 8 条记录(假设 GameDate 不是唯一的)。我也很困惑HAVING 1 的用途。查看一些示例记录可能会有所帮助。
  • 我有很多同名同发行期的游戏,唯一的区别是平台不同。例如:适用于 PS4、Xbox 和 PC 的 GTA V,我只想显示其中一个,所以我在 GamesName 上使用了 HAVING 1。我需要在子查询中使用Limid 8order by GameDate Desc,因为当我删除LIMIT 8 子查询时会返回所有游戏,所以结果不会显示任何内容,当我删除ORDER BY GameDate DEST 时它不会返回最新的游戏。如果你愿意,我可以向你发送一些带有数据库和网站的截图,它的外观和我的意思。:)
  • 这里是一些截图:prnt.sc/dinrtz(网站)prnt.sc/dinsh3(我正在使用的表格)

标签: mysql subquery limit


【解决方案1】:

我已经做到了。我用选择创建了一个新视图。

CREATE VIEW Novinky AS SELECT games.GameID FROM games WHERE games.GameDate <= NOW() AND games.GameSlide = 0 GROUP BY games.GameName HAVING 1 ORDER BY `games`.`GameDate` DESC LIMIT 8

然后将 NOT IN 与 SELECT from View 一起使用:

SELECT *,platform.platformName FROM games JOIN platform ON(platform.PlatformID=games.GamePlatform) WHERE GameID NOT IN (SELECT * FROM novinky) AND platform.PlatformID = 2 AND GameSlide = 0 GROUP BY GameName HAVING 1 order by rand(dayofyear(CURRENT_DATE)) LIMIT 8

【讨论】:

  • 我怀疑有一个更有效的解决方案,但做得很好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多