2017-08-29 102 views
0

该请求可以根据需要运行,但我明白这不正确,请帮助我理解如何正确地进行类似查询。如何用相似的子查询优化Mysql查询?

注意:选择read_date和选择auto重复!

Thx!

SELECT let.letter_from, let.`letter_to`, COUNT(let.`letter_from`) AS sendMail, 
    (SELECT COUNT(`status`) 
    FROM letters 
    WHERE `status` = 1 AND letter_from = 310 AND letter_to = let.`letter_to` 
    ) AS readMail, 
    (SELECT `read_date` 
     FROM letters 
     WHERE letter_from = 310 AND `status` = 1 AND `letter_to` = let.`letter_to` 
     ORDER BY `read_date` DESC LIMIT 1 
    ) AS dateLastRead, 
    (SELECT `auto` 
     FROM letters 
     WHERE letter_from = 310 AND `status` = 1 AND `letter_to` = let.`letter_to` 
     ORDER BY `read_date` DESC LIMIT 1 
    ) AS auto 
FROM `letters` let 
WHERE letter_from = 310 
GROUP BY letter_to; 
CREATE TABLE `letters` (
    `letter_id` int(11) NOT NULL AUTO_INCREMENT, 
    `letter_to` int(11) NOT NULL, 
    `letter_from` int(11) NOT NULL, 
    `letter_send_date` datetime NOT NULL, 
    `status` tinyint(1) NOT NULL, 
    `first_letter` tinyint(1) NOT NULL DEFAULT '0', 
    `auto` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    `answer` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    `read_date` datetime DEFAULT NULL, 
    `answer_date` datetime DEFAULT NULL, 
    `forgetting` tinyint(1) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`letter_id`), 
    KEY `letter_to` (`letter_to`), 
    KEY `letter_from` (`letter_from`) 
) ENGINE=InnoDB AUTO_INCREMENT=604 DEFAULT CHARSET=utf8;
insert into `letters`(`letter_id`,`letter_to`,`letter_from`,`letter_send_date`,`status`,`first_letter`,`auto`,`answer`,`read_date`,`answer_date`,`forgetting`) values 
(482,310,313,'2017-02-10 13:32:56',1,0,0,1,'2017-02-11 12:33:15','2017-02-13 12:28:43',0), 
(483,310,313,'2017-02-10 13:51:12',1,0,0,1,'2017-02-12 12:33:15','2017-02-10 14:03:46',0), 
(484,310,313,'2017-02-10 13:52:02',1,0,0,1,'2017-02-11 12:33:15','2017-02-10 14:01:47',0), 
(485,313,310,'2017-02-10 13:58:03',1,0,0,1,'2017-02-12 12:33:15','2017-02-13 12:39:26',0), 
(486,313,310,'2017-02-10 14:01:22',1,0,0,1,'2017-02-11 11:33:15','2017-02-13 12:38:47',0), 
(487,313,310,'2017-02-10 14:03:46',1,0,0,1,'2017-02-12 12:33:15','2017-02-13 12:37:38',0), 
(488,313,310,'2017-02-10 14:27:53',1,0,0,1,'2017-02-13 11:33:15','2017-02-13 12:34:19',0), 
(489,313,310,'2017-02-13 12:28:43',1,0,0,1,'2017-02-13 10:33:15','2017-02-13 12:33:15',0), 
(490,310,313,'2017-02-13 12:33:15',0,0,0,0,NULL,NULL,0), 
(491,310,313,'2017-02-13 12:34:02',0,0,0,0,NULL,NULL,0), 
(492,310,313,'2017-02-13 12:36:30',1,0,0,1,'2017-02-13 13:00:21','2017-02-13 13:09:35',0), 
(493,310,313,'2017-02-13 12:37:38',1,0,0,1,'2017-02-13 13:00:21','2017-02-13 13:06:21',0), 
(494,310,313,'2017-02-13 12:38:47',1,0,0,1,'2017-02-13 13:00:59','2017-02-13 13:04:59',0), 
(495,310,313,'2017-02-13 12:39:26',1,0,0,1,'2017-02-13 12:40:41','2017-02-13 12:43:41',0), 
(496,313,310,'2017-02-13 12:43:41',1,0,0,1,'2017-02-17 12:43:41','2017-03-22 12:26:48',0), 
(497,313,310,'2017-02-13 12:55:44',1,0,0,1,'2017-02-15 12:55:44','2017-03-22 12:25:36',0), 
(498,313,310,'2017-02-13 13:02:26',1,0,0,1,'2017-02-15 13:02:26','2017-03-22 12:24:37',0), 
(499,313,310,'2017-02-13 13:03:55',1,0,0,1,'2017-03-05 15:14:53','2017-03-06 15:14:53',0), 
(500,313,310,'2017-02-13 13:04:59',1,0,0,1,'2017-02-13 14:20:43','2017-02-13 14:26:43',0), 
(501,313,310,'2017-02-13 13:06:21',1,0,0,1,'2017-03-05 15:12:35','2017-03-06 15:12:35',0), 
(502,313,310,'2017-02-13 13:09:34',1,0,0,1,'2017-02-13 13:09:46','2017-02-13 13:10:46',0), 
(503,310,313,'2017-02-13 13:10:46',0,0,0,0,NULL,NULL,0), 
(504,310,313,'2017-02-13 14:25:04',0,0,0,0,NULL,NULL,0), 
(505,310,313,'2017-02-13 14:26:43',0,0,0,0,NULL,NULL,0), 
(506,310,313,'2017-03-06 15:12:35',0,0,0,0,NULL,NULL,0), 
(507,310,313,'2017-03-06 15:14:00',0,0,0,0,NULL,NULL,0), 
(508,310,313,'2017-03-06 15:14:11',0,0,0,0,NULL,NULL,0), 
(509,310,313,'2017-03-06 15:14:22',1,0,0,1,'2017-03-29 12:53:45','2017-03-29 12:54:21',0), 
(510,310,313,'2017-03-06 15:14:36',1,0,0,0,'2017-04-21 13:32:15',NULL,0), 
(511,310,313,'2017-03-06 15:14:42',1,0,0,1,'2017-04-21 13:04:17','2017-04-21 13:04:46',0), 
(512,310,313,'2017-03-06 15:14:53',1,0,0,1,'2017-03-29 12:53:35','2017-04-21 13:07:17',0), 
(513,310,313,'2017-03-06 15:16:05',0,0,0,0,NULL,NULL,0), 
(514,310,313,'2017-03-06 15:16:27',0,0,0,0,NULL,NULL,0), 
(515,310,313,'2017-03-06 15:16:42',0,0,0,0,NULL,NULL,0), 
(516,310,313,'2017-03-06 15:17:20',1,0,0,0,'2017-04-21 13:11:01',NULL,0), 
(517,325,313,'2017-03-06 15:21:59',1,0,0,1,'2017-03-20 12:22:28','2017-03-22 12:22:28',0), 
(518,312,313,'2017-03-06 15:41:34',1,0,0,1,'2017-03-22 14:07:43','2017-03-22 14:08:11',0), 
(519,327,313,'2017-03-06 15:52:26',1,0,0,1,'2017-03-20 13:34:38','2017-03-22 11:51:58',0), 
(520,313,327,'2017-03-22 11:51:58',1,0,0,1,'2017-03-20 12:22:28','2017-03-22 12:32:09',0), 
(521,313,325,'2017-03-22 12:22:07',1,0,0,1,'2017-03-20 12:22:28','2017-03-22 12:24:01',0), 
(522,325,313,'2017-03-22 12:24:01',1,0,0,1,'2017-04-21 13:31:22','2017-04-21 13:32:21',0), 
(523,310,313,'2017-03-22 12:24:37',1,0,0,0,'2017-04-21 13:23:42',NULL,0), 
(524,310,313,'2017-03-22 12:25:17',1,0,0,1,'2017-04-21 13:03:29','2017-04-21 13:03:45',0), 
(525,310,313,'2017-03-22 12:26:48',1,0,0,1,'2017-04-21 13:10:23','2017-04-21 13:10:55',0), 
(526,327,313,'2017-03-22 12:32:09',1,0,0,1,'2017-03-22 12:32:09','2017-03-22 12:33:10',0), 
(527,313,327,'2017-03-22 12:33:10',1,0,0,1,'2017-03-22 12:33:09','2017-03-22 12:35:59',0), 
(528,327,313,'2017-03-22 12:35:59',1,0,0,1,'2017-03-22 12:36:09','2017-03-22 12:38:05',0), 
(529,313,327,'2017-03-22 12:38:05',1,0,0,1,'2017-03-22 12:38:09','2017-03-22 12:38:58',0), 
(530,327,313,'2017-03-22 12:38:58',0,0,0,0,NULL,NULL,0), 
(531,326,313,'2017-03-22 13:23:36',0,0,0,0,NULL,NULL,0), 
(532,310,313,'2017-03-22 13:29:22',1,0,0,1,'2017-03-29 12:53:18','2017-04-21 13:13:46',0), 
(533,310,311,'2017-03-22 14:03:06',1,0,0,1,'2017-08-03 13:44:16','2017-08-03 13:44:20',0), 
(534,310,311,'2017-03-22 14:03:24',1,0,0,1,'2017-08-03 13:44:23','2017-08-03 13:44:28',0), 
(535,329,311,'2017-03-22 14:06:53',0,0,0,0,NULL,NULL,0), 
(536,313,312,'2017-03-22 14:08:11',1,0,0,1,'2017-03-23 12:22:08','2017-03-27 12:22:08',0), 
(537,335,313,'2017-03-27 12:20:53',0,0,0,0,NULL,NULL,0), 
(538,312,313,'2017-03-27 12:22:08',1,0,0,1,'2017-06-28 12:13:32','2017-06-28 12:13:42',0), 
(539,341,311,'2017-03-27 12:50:39',1,0,0,1,'2017-04-10 13:59:38','2017-06-28 12:12:28',0), 
(540,325,346,'2017-03-27 13:16:10',1,0,0,1,'2017-04-10 13:02:51','2017-04-10 13:03:04',0), 
(541,328,346,'2017-03-27 13:19:39',1,0,0,1,'2017-06-28 12:12:39','2017-06-28 12:12:50',0), 
(542,313,310,'2017-03-29 12:54:21',1,0,0,1,'2017-04-10 13:18:09','2017-04-21 13:18:09',0), 
(543,346,325,'2017-04-10 13:03:04',1,0,0,0,'2017-04-14 13:03:04',NULL,0), 
(544,354,352,'2017-04-21 12:34:45',1,0,0,1,'2017-05-11 13:20:32','2017-05-12 13:17:54',0), 
(545,335,352,'2017-04-21 12:35:24',1,0,0,1,'2017-05-11 13:20:32','2017-05-12 13:20:32',0), 
(546,313,310,'2017-04-21 13:03:45',1,0,1,0,'2017-04-26 13:13:46',NULL,0), 
(547,313,310,'2017-04-21 13:04:46',1,0,0,0,'2017-04-25 13:13:46',NULL,0), 
(548,313,310,'2017-04-21 13:07:17',1,0,0,0,'2017-04-22 13:13:46',NULL,0), 
(549,313,310,'2017-04-21 13:10:55',1,0,0,0,'2017-04-22 13:13:46',NULL,0), 
(551,313,310,'2017-04-21 13:13:46',1,0,1,0,'2017-04-23 13:13:46',NULL,0), 
(552,310,313,'2017-04-21 13:18:09',1,0,0,1,'2017-04-21 13:19:21','2017-04-21 13:19:57',0), 
(553,313,310,'2017-04-21 13:19:57',0,0,0,0,NULL,NULL,0), 
(554,313,325,'2017-04-21 13:32:21',0,0,0,0,NULL,NULL,0), 
(555,313,310,'2017-04-21 15:01:43',0,0,0,0,NULL,NULL,0), 
(556,352,354,'2017-05-12 13:14:47',3,1,0,0,NULL,NULL,0), 
(557,341,376,'2017-05-12 13:16:46',1,0,0,1,'2017-05-26 13:57:04','2017-05-26 13:57:22',0), 
(558,312,376,'2017-05-12 13:16:55',0,0,0,0,NULL,NULL,0), 
(559,352,354,'2017-05-12 13:17:54',0,0,0,0,NULL,NULL,0), 
(560,327,376,'2017-05-12 13:19:18',0,0,0,0,NULL,NULL,0), 
(561,352,335,'2017-05-12 13:19:56',3,1,0,0,NULL,NULL,0), 
(562,352,335,'2017-05-12 13:20:04',0,0,0,0,NULL,NULL,0), 
(563,352,335,'2017-05-12 13:20:13',0,0,0,0,NULL,NULL,0), 
(564,352,335,'2017-05-12 13:20:32',0,0,0,0,NULL,NULL,0), 
(566,377,335,'2017-05-12 13:29:30',1,1,0,1,'2017-05-12 12:29:52','2017-05-12 13:29:52',0), 
(567,335,377,'2017-05-12 13:29:52',0,0,0,0,NULL,NULL,0), 
(568,376,335,'2017-05-12 13:30:41',3,1,0,0,NULL,NULL,0), 
(569,376,335,'2017-05-12 13:30:47',0,0,0,0,NULL,NULL,0), 
(570,376,341,'2017-05-26 13:57:22',0,0,0,0,NULL,NULL,0), 
(571,376,341,'2017-05-30 16:02:58',0,0,0,0,NULL,NULL,0), 
(572,328,352,'2017-06-17 13:24:49',1,0,0,1,'2017-06-28 12:13:01','2017-06-28 12:13:07',0), 
(573,328,352,'2017-06-17 13:25:21',1,0,0,1,'2017-06-28 12:13:02','2017-06-28 12:13:18',0), 
(576,341,381,'2017-06-23 14:19:48',1,0,0,1,'2017-06-28 12:10:58','2017-06-28 12:11:13',0), 
(577,341,381,'2017-06-23 14:20:01',1,0,0,1,'2017-06-28 12:11:25','2017-06-28 12:11:40',0), 
(578,313,327,'2017-06-24 14:42:53',0,0,0,0,NULL,NULL,0), 
(579,313,327,'2017-06-24 14:43:38',0,0,0,0,NULL,NULL,0), 
(580,327,376,'2017-06-28 12:03:59',0,0,0,0,NULL,NULL,0), 
(581,341,376,'2017-06-28 12:04:24',0,0,0,0,NULL,NULL,0), 
(582,341,376,'2017-06-28 12:04:48',0,0,0,0,NULL,NULL,0), 
(583,341,376,'2017-06-28 12:05:03',0,0,0,0,NULL,NULL,0), 
(584,381,341,'2017-06-28 12:11:13',0,0,0,0,NULL,NULL,0), 
(585,381,341,'2017-06-28 12:11:40',0,0,0,0,NULL,NULL,0), 
(586,311,341,'2017-06-28 12:12:27',0,0,0,0,NULL,NULL,0), 
(587,346,328,'2017-06-28 12:12:50',0,0,0,0,NULL,NULL,0), 
(588,352,328,'2017-06-28 12:13:07',0,0,0,0,NULL,NULL,0), 
(589,352,328,'2017-06-28 12:13:18',0,0,0,0,NULL,NULL,0), 
(590,313,312,'2017-06-28 12:13:42',0,0,0,0,NULL,NULL,0), 
(591,327,387,'2017-06-28 12:27:41',0,0,0,0,NULL,NULL,0), 
(592,327,381,'2017-07-03 14:25:24',0,0,0,0,NULL,NULL,0), 
(593,341,389,'2017-07-08 12:58:46',1,0,0,0,'2017-07-09 12:58:46',NULL,0), 
(594,311,310,'2017-08-03 13:44:20',0,0,0,0,NULL,NULL,0), 
(595,311,310,'2017-08-03 13:44:28',0,0,0,0,NULL,NULL,0), 
(596,391,310,'2017-08-03 14:07:19',1,1,0,0,'2017-08-04 14:07:19',NULL,0), 
(597,391,310,'2017-08-10 15:07:26',1,1,0,1,'2017-08-20 13:44:30','2017-08-28 13:44:30',0), 
(598,310,389,'2017-08-04 11:40:08',0,0,0,0,NULL,NULL,0), 
(599,310,369,'2017-08-17 17:24:26',1,0,0,1,'2017-08-17 17:25:16','2017-08-17 17:30:31',0), 
(600,369,310,'2017-08-17 17:30:31',1,0,0,0,'2017-08-18 17:30:31',NULL,0), 
(601,310,390,'2017-08-28 13:44:30',0,0,0,0,NULL,NULL,0), 
(602,310,391,'2017-08-28 13:54:47',0,0,0,0,NULL,NULL,0), 
(603,327,391,'2017-08-28 13:55:19',0,0,0,0,NULL,NULL,0);
+0

请参阅[为什么我应该提供一个MCVE来处理我认为是非常简单的SQL查询](http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve - 对于什么似乎对我来说是一个非常简单的SQL查询) – Strawberry

+0

你确定你想要计数状态不是1的sendmails,或者应该是在底部的where条件? – trincot

回答

0

这是难看的,但添加这些(在给定的顺序):

INDEX(letter_from, `status`, `letter_to`, `read_date`, `auto`) 
INDEX(letter_from, letter_to, status) 

首先是为子查询,并且是 '覆盖';第二个用于外部查询,并应避免tmp表和/或文件。 (见EXPLAIN SELECT ...

你真的想COUNT(status)?这会计算非空状态行的数量。也许你想要SUM(status),这会给你一个更小的数字。

这是没有意义的:

SELECT COUNT(let.`letter_from`) AS sendMail 
    ... WHERE letter_from = 310 

什么是你从COUNT期待?

我现在放弃了COUNTsstatus。再看看其余部分,我推断你正试图从310找到每个可能的收件人(letter_to)的“最新”字母。然后显示read_date和auto以及其他一些东西?

让我们先来看看找到“最新”:

SELECT letter_from, letter_to, MAX(read_date) 
    FROM letters 
    WHERE letter_from = 310 
    GROUP BY letter_to; 

不要做任何比较复杂,你会惹上麻烦。性能添加INDEX(letter_from, letter_to, read_date)

现在,让我们使用它作为“派生”表:

SELECT l.letter_from, 
     l.letter_to, 
     s.read_date, 
     s.auto 
    FROM (that subquery ...) AS s 
    JOIN letters AS l USING(letter_from, letter_to, read_date) 

然后,更好地了解status后,也许我可以折叠,在没有太多精力。