2016-05-23 9 views
0

私は以下のようにMySQLにテーブルを持っています。MySQLでサブクエリを削除する

CREATE TABLE `myTable` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `employeeNumber` int(11) DEFAULT NULL, 
    `approveDate` date DEFAULT NULL, 
    `documentNumber` varchar(50) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `INDEX_1` (`documentNumber`) 
) ENGINE=InnoDB; 

私はdocumentNumberがすべてemployeeNumberによって承認または任意のemployeeNumberによって承認employeeNumberかのいくつかによって承認された場合、クエリを作りたいです。

私は以下のように質問しました。

SELECT T1.documentNumber, 
(CASE WHEN T2.currentNum = '0' THEN '1' WHEN T2.currentNum < T2.totalNum THEN '2' ELSE '3' END) AS approveStatusNumber 
FROM myTable AS T1 LEFT JOIN 
    (SELECT documentNumber, COUNT(*) AS totalNum, SUM(CASE WHEN approveDate IS NOT NULL THEN '1' ELSE '0' END) AS currentNum 
    FROM myTable GROUP by documentNumber) AS T2 ON T1.documentNumber = T2.documentNumber 
GROUP BY T1.documentNumber; 

このSQLは機能しますが、非常に遅いです。 このSQLでexplainを試しましたが、結果は以下のようになります。

+----+-------------+------------+-------+---------------+---------+---------+------+------+----------------------------------------------+ 
| id | select_type | table  | type | possible_keys | key  | key_len | ref | rows | Extra          | 
+----+-------------+------------+-------+---------------+---------+---------+------+------+----------------------------------------------+ 
| 1 | PRIMARY  | T1   | range | INDEX_1  | INDEX_1 | 153  | NULL | 27 | Using where; Using temporary; Using filesort | 
| 1 | PRIMARY  | <derived2> | ALL | NULL   | NULL | NULL | NULL | 5517 |            | 
| 2 | DERIVED  | myTable | index | NULL   | INDEX_1 | 153  | NULL | 5948 | Using where         | 
+----+-------------+------------+-------+---------------+---------+---------+------+------+----------------------------------------------+ 

私は質問を改善するためにサブクラスを排除する必要があると思います。 サブクエリーなしで同じことを行うにはどうすればよいですか?または、クエリを改善する別の方法がありますか?

答えて

0

(MySQLの中で)currentNumがより簡潔に表現することができ返すように表現

SUM(approveDate IS NOT NULL) 

として、およびインライン・ビューのための必要はありません。これは同等の結果を返します:

SELECT t.documentNumber 
    , CASE 
     WHEN SUM(t.approveDate IS NOT NULL) = 0 
      THEN '1' 
     WHEN SUM(t.approveDate IS NOT NULL) < COUNT(*) 
      THEN '2' 
     ELSE '3' 
     END AS approveStatusNumber 
    FROM myTable t 
GROUP BY t.documentNumber 
ORDER BY t.documentNumber 
関連する問題