mysql - 从三个简单查询创建复杂查询

标签 mysql sql

小背景:我已经花了大半天的时间来研究这个问题,我很兴奋我几乎找到了解决方案,只是我似乎无法将最终的 MySQL 查询放在一起。这都是关于MySQL语法的,所以我相信不需要给出表模式等。

查询部分:

1)

SELECT id, globalId, date, serverId, gamemodeId, mapId FROM levelsloaded

2)

(
(SELECT id, globalId, date, serverId, playerId, 'playerjoins' AS origin 
FROM playerjoins WHERE playerId = 2224 AND date <= levelsloaded.date 
ORDER BY date DESC)
UNION ALL
(SELECT id, globalId, date, serverId, playerId, 'playerleaves' AS origin 
FROM playerleaves WHERE playerId = 2224 AND date <= levelsloaded.date 
ORDER BY date DESC)
ORDER BY date DESC LIMIT 1) below

3)

(
(SELECT id, globalId, date, serverId, playerId, 'playerjoins' AS origin 
FROM playerjoins WHERE playerId = 2224 AND date >= levelsloaded.date 
ORDER BY date ASC)
UNION ALL
(SELECT id, globalId, date, serverId, playerId, 'playerleaves' AS origin 
FROM playerleaves WHERE playerId = 2224 AND date >= levelsloaded.date 
ORDER BY date ASC)
ORDER BY date ASC LIMIT 1) above

如果需要的话,这里是架构:

CREATE TABLE `levelsloaded` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `globalId` int(11) NOT NULL,
  `date` datetime NOT NULL,
  `serverId` int(11) NOT NULL,
  `gamemodeId` int(11) NOT NULL,
  `mapId` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `globalId` (`globalId`),
  KEY `date` (`date`),
  KEY `serverId` (`serverId`),
  KEY `gamemodeId` (`gamemodeId`),
  KEY `mapId` (`mapId`),
  CONSTRAINT `levelsloaded_ibfk_1` FOREIGN KEY (`serverId`) REFERENCES `servers` (`serverId`),
  CONSTRAINT `levelsloaded_ibfk_2` FOREIGN KEY (`gamemodeId`) REFERENCES `gamemodes` (`gamemodeId`),
  CONSTRAINT `levelsloaded_ibfk_3` FOREIGN KEY (`mapId`) REFERENCES `maps` (`mapId`)
) ENGINE=InnoDB AUTO_INCREMENT=1104 DEFAULT CHARSET=latin1
<小时/>
CREATE TABLE `playerjoins` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `globalId` int(11) NOT NULL,
  `date` datetime NOT NULL,
  `serverId` int(11) NOT NULL,
  `playerId` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `globalId` (`globalId`),
  KEY `date` (`date`),
  KEY `serverId` (`serverId`),
  KEY `playerId` (`playerId`),
  CONSTRAINT `playerjoins_ibfk_1` FOREIGN KEY (`serverId`) REFERENCES `servers` (`serverId`),
  CONSTRAINT `playerjoins_ibfk_2` FOREIGN KEY (`playerId`) REFERENCES `players` (`playerId`)
) ENGINE=InnoDB AUTO_INCREMENT=64983 DEFAULT CHARSET=latin1
<小时/>
CREATE TABLE `playerleaves` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `globalId` int(11) NOT NULL,
  `date` datetime NOT NULL,
  `serverId` int(11) NOT NULL,
  `playerId` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `globalId` (`globalId`),
  KEY `date` (`date`),
  KEY `serverId` (`serverId`),
  KEY `playerId` (`playerId`),
  CONSTRAINT `playerleaves_ibfk_1` FOREIGN KEY (`serverId`) REFERENCES `servers` (`serverId`),
  CONSTRAINT `playerleaves_ibfk_2` FOREIGN KEY (`playerId`) REFERENCES `players` (`playerId`)
) ENGINE=InnoDB AUTO_INCREMENT=45676 DEFAULT CHARSET=latin1

现在回答问题:

我想将查询部分 (1) 与部分 (2) 和 (3) 结合起来,只有在 below.origin = ' 时才会返回 levelsloaded 中的行playerjoin' AND above.origin = 'playerleave'。我目前陷入了合并表格和 IF 部分的困境。

最佳答案

尽管这不是最有效的方法。

SELECT id, globalId, date, serverId, gamemodeId, mapId 
FROM levelsloaded l
    JOIN above a ON 1 = 1
    JOIN below b ON 1 = 1
WHERE b.origin = 'playerjoin' AND a.origin = 'playerleave'

关于mysql - 从三个简单查询创建复杂查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20225472/

相关文章:

sql - 我应该合并 2 个只有一个字段不同的 sql 表吗

c++ - 打开 ODBC 数据库时 Qt 应用程序崩溃

sql - 查询优化

javascript - AJAX按钮: Male vs Female - Need 3rd choice (both)

php - 在 MySQL 中选择下一个日期

php - 单一登录表单的数据库查询从两个注册表中提取数据

mysql - 排序依据未按预期排序

c# - 使用多个参数选择返回mysql语法错误

mysql - 如何将两个表内连接到连接表

php - MySQL查询不适用于PHP变量