Php 将Order By、Limit和Offset放入Union All的子查询中

Php 将Order By、Limit和Offset放入Union All的子查询中,php,mysql,sql,sql-order-by,sql-limit,Php,Mysql,Sql,Sql Order By,Sql Limit,我得到了下表,其中保存了大约700K条记录: CREATE TABLE `trades` ( `tradeId` int(11) NOT NULL AUTO_INCREMENT, `userId` int(11) NOT NULL, `visible` int(11) NOT NULL DEFAULT '1', `sourceItem` int(11) NOT NULL, `sourceKeyTierId` int(11) DEFAULT NULL, `sourceKeyTypeId

我得到了下表,其中保存了大约700K条记录:

CREATE TABLE `trades` (
 `tradeId` int(11) NOT NULL AUTO_INCREMENT,
 `userId` int(11) NOT NULL,
 `visible` int(11) NOT NULL DEFAULT '1',
 `sourceItem` int(11) NOT NULL,
 `sourceKeyTierId` int(11) DEFAULT NULL,
 `sourceKeyTypeId` int(11) DEFAULT NULL,
 `sourceKeyAmount` int(11) DEFAULT NULL,
 `sourceModId` int(11) DEFAULT NULL,
 `sourceModLevel` int(11) DEFAULT NULL,
 `destinationItem` int(11) NOT NULL,
 `destinationPlatinum` int(11) DEFAULT NULL,
 `destinationKeyTierId` int(11) DEFAULT NULL,
 `destinationKeyTypeId` int(11) DEFAULT NULL,
 `destinationKeyAmount` int(11) DEFAULT NULL,
 `destinationModId` int(11) DEFAULT NULL,
 `destinationModLevel` int(11) DEFAULT NULL,
 `added` datetime NOT NULL,
 PRIMARY KEY (`tradeId`),
 KEY `userId` (`userId`),
 KEY `sourceKeyTierId` (`sourceKeyTierId`),
 KEY `sourceKeyTypeId` (`sourceKeyTypeId`),
 KEY `sourceModId` (`sourceModId`),
 KEY `destinationKeyTierId` (`destinationKeyTierId`),
 KEY `destinationKeyTypeId` (`destinationKeyTypeId`),
 KEY `destinationModId` (`destinationModId`),
 CONSTRAINT `trades_ibfk_1` FOREIGN KEY (`userId`) REFERENCES `users` (`userId`),
 CONSTRAINT `trades_ibfk_2` FOREIGN KEY (`sourceKeyTierId`) REFERENCES `keytiers` (`keyTierId`),
 CONSTRAINT `trades_ibfk_3` FOREIGN KEY (`sourceKeyTypeId`) REFERENCES `keytypes` (`keyTypeId`),
 CONSTRAINT `trades_ibfk_4` FOREIGN KEY (`sourceModId`) REFERENCES `mods` (`modId`),
 CONSTRAINT `trades_ibfk_5` FOREIGN KEY (`destinationKeyTierId`) REFERENCES `keytiers` (`keyTierId`),
 CONSTRAINT `trades_ibfk_6` FOREIGN KEY (`destinationKeyTypeId`) REFERENCES `keytypes` (`keyTypeId`),
 CONSTRAINT `trades_ibfk_7` FOREIGN KEY (`destinationModId`) REFERENCES `mods` (`modId`)
) ENGINE=InnoDB AUTO_INCREMENT=732566 DEFAULT CHARSET=latin1
现在我想查询它,并从中获得10个结果,如下查询所示:

  (SELECT 'Key' AS tradeOrigin,
          CONCAT(skti.tier, ' ', skty.type) AS trade,
          CONCAT('Amount: ', t.sourceKeyAmount) AS tradeInfo,
          'Platinum' AS tradeToOrigin,
          t.destinationPlatinum AS tradeTo,
          '' AS tradeToInfo,
          u.ingame AS seller,
          DAYSPASSED(added) AS daysPassed,
          DATEDIFF(NOW(), added) AS sortingSince
   FROM trades t
   JOIN users u ON t.sourceItem = 1
   AND t.destinationItem = 1
   AND t.visible = 1
   AND t.userId = u.userId
   JOIN keytiers skti ON t.sourceKeyTierId = skti.keyTierId
   JOIN keytypes skty ON t.sourceKeyTypeId = skty.keyTypeId)
UNION ALL
  (SELECT 'Key' AS tradeOrigin,
          CONCAT(skti.tier, ' ', skty.type) AS trade,
          CONCAT('Amount: ', t.sourceKeyAmount) AS tradeInfo,
          'Key' AS tradeToOrigin,
          CONCAT(dkti.tier, ' ', dkty.type) AS tradeTo,
          CONCAT('Amount: ', t.destinationKeyAmount) AS tradeToInfo,
          u.ingame AS seller,
          DAYSPASSED(added) AS daysPassed,
          DATEDIFF(NOW(), added) AS sortingSince
   FROM trades t
   JOIN users u ON t.sourceItem = 1
   AND t.destinationItem = 2
   AND t.visible = 1
   AND t.userId = u.userId
   JOIN keytiers skti ON t.sourceKeyTierId = skti.keyTierId
   JOIN keytypes skty ON t.sourceKeyTypeId = skty.keyTypeId
   JOIN keytiers dkti ON t.destinationKeyTierId = dkti.keyTierId
   JOIN keytypes dkty ON t.destinationKeyTypeId = dkty.keyTypeId)
UNION ALL
  (SELECT 'Key' AS tradeOrigin,
          CONCAT(skti.tier, ' ', skty.type) AS trade,
          CONCAT('Amount: ', t.sourceKeyAmount) AS tradeInfo,
          'Mod' AS tradeToOrigin,
          dm.name AS tradeTo,
          CONCAT('Level: ', IF(t.destinationModLevel = 0, 'Unranked', t.destinationModLevel)) AS tradeToInfo,
          u.ingame AS seller,
          DAYSPASSED(added) AS daysPassed,
          DATEDIFF(NOW(), added) AS sortingSince
   FROM trades t
   JOIN users u ON t.sourceItem = 1
   AND t.destinationItem = 3
   AND t.visible = 1
   AND t.userId = u.userId
   JOIN keytiers skti ON t.sourceKeyTierId = skti.keyTierId
   JOIN keytypes skty ON t.sourceKeyTypeId = skty.keyTypeId
   JOIN mods dm ON t.destinationModId = dm.modId)
UNION ALL
  (SELECT 'Mod' AS tradeOrigin,
          sm.name AS trade,
          CONCAT('Level: ', IF(t.sourceModLevel = 0, 'Unranked', t.sourceModLevel)) AS tradeInfo,
          'Platinum' AS tradeToOrigin,
          t.destinationPlatinum AS tradeTo,
          '' AS tradeToInfo,
          u.ingame AS seller,
          DAYSPASSED(added) AS daysPassed,
          DATEDIFF(NOW(), added) AS sortingSince
   FROM trades t
   JOIN users u ON t.sourceItem = 2
   AND t.destinationItem = 1
   AND t.visible = 1
   AND t.userId = u.userId
   JOIN mods sm ON t.sourceModId = sm.modId)
UNION ALL
  (SELECT 'Mod' AS tradeOrigin,
          sm.name AS trade,
          CONCAT('Level: ', IF(t.sourceModLevel = 0, 'Unranked', t.sourceModLevel)) AS tradeInfo,
          'Key' AS tradeToOrigin,
          CONCAT(dkti.tier, ' ', dkty.type) AS tradeTo,
          CONCAT('Amount: ', t.destinationKeyAmount) AS tradeToInfo,
          u.ingame AS seller,
          DAYSPASSED(added) AS daysPassed,
          DATEDIFF(NOW(), added) AS sortingSince
   FROM trades t
   JOIN users u ON t.sourceItem = 2
   AND t.destinationItem = 2
   AND t.visible = 1
   AND t.userId = u.userId
   JOIN mods sm ON t.sourceModId = sm.modId
   JOIN keytiers dkti ON t.destinationKeyTierId = dkti.keyTierId
   JOIN keytypes dkty ON t.destinationKeyTypeId = dkty.keyTypeId)
UNION ALL
  (SELECT 'Mod' AS tradeOrigin,
          sm.name AS trade,
          CONCAT('Level: ', IF(t.sourceModLevel = 0, 'Unranked', t.sourceModLevel)) AS tradeInfo,
          'Mod' AS tradeToOrigin,
          dm.name AS tradeTo,
          CONCAT('Level: ', IF(t.destinationModLevel = 0, 'Unranked', t.destinationModLevel)) AS tradeToInfo,
          u.ingame AS seller,
          DAYSPASSED(added) AS daysPassed,
          DATEDIFF(NOW(), added) AS sortingSince
   FROM trades t
   JOIN users u ON t.sourceItem = 2
   AND t.destinationItem = 3
   AND t.visible = 1
   AND t.userId = u.userId
   JOIN mods sm ON t.sourceModId = sm.modId
   JOIN mods dm ON t.destinationModId = dm.modId) LIMIT 0,
                                                        10
这个查询需要196秒,因此显然我需要在几个子查询中设置约束(
orderby
LIMIT

但是,我对如何添加它们感到困惑,我使用以下PHP动态选择
LIMIT

//Limiting
$offset = ($page - 1) * $limit;
$sql .= " LIMIT {$offset}, {$limit}";
当我使用页面系统显示结果时,这意味着我想要的东西适用于:

  • 从~700K行的结果0到9
  • 从~700K行中获得10到19个结果
  • 等等
  • 结果从~700K行从699990到699999
我知道如果你只想要结果集的尾部,假设你想要20条记录。然后每个子查询都需要获得
20*[subquery\u count]
记录,以确保不会丢失记录。

但是,现在还需要考虑补偿,我该怎么做呢?

Yikes。我将检查单独运行的子查询的解释并优化它们。“更多的排序依据和限制不会保存此内容。@DigitalChris我会将压力测试减少到20K行,关于我需要放置索引的内容?这就是
解释
将告诉您的内容。”