2

少し問題があります。注文管理システムを開発しました。新機能として、ユーザーはリストビューで各注文のステータスを確認できるようになりました。

私のテーブルは次のようなものです:

注文:

id INT AUTO PRIMARY,
orderNo VARCHAR(20),
customerId INT,
salesmanId INT,
orderdate DATE

注文の状況:

id INT AUTO PRIMARY,
type ENUM (1,2,3,4),
orderId INT,
plannedDate DATE,
finalDate DATE,
isApproved ENUM(0,1)

そして、データをリストするための私の現在のクエリは次のとおりです。

SELECT
o.orderNo,
cst.name as customerName,
u.name as salesmanName,
o.orderdate,
t1.plannedDate as t1Planned,
t2.plannedDate as t2Planned,
t3.plannedDate as t3Planned,
t4.plannedDate as t4Planned,
t1.finalDate as t1Final,
t2.finalDate as t2Final,
t3.finalDate as t3Final,
t4.finalDate as t4Final,
t1.isApproved as t1App,
t2.isApproved as t2App,
t3.isApproved as t3App,
t4.isApproved as t4App
FROM orders as o
LEFT JOIN customers as cst ON ( cst.id = o.customerId)
LEFT JOIN users as u ON ( u.id = o.salesmanId )
LEFT JOIN orderStatus as t1 ON ( t1.type = 1 AND t1.orderId = o.id )
LEFT JOIN orderStatus as t2 ON ( t2.type = 2 AND t2.orderId = o.id )
LEFT JOIN orderStatus as t3 ON ( t3.type = 3 AND t3.orderId = o.id )
LEFT JOIN orderStatus as t4 ON ( t4.type = 4 AND t4.orderId = o.id )
ORDER BY
o.orderNo DESC

ご覧のとおり、多くの左結合がありますが、これは別の方法で実行できることを願っています。主な問題は、このクエリがかなり遅いことです。誰かが私を助けてくれることを願っています。前もって感謝します。

4

1 に答える 1

1

更新:条件付き集計を使用できます

SELECT o.orderNo,
       c.name as customerName,
       u.name as salesmanName,
       o.orderdate,
       MAX(CASE WHEN s.type = 1 THEN plannedDate END) Planned1,
       MAX(CASE WHEN s.type = 2 THEN plannedDate END) Planned2,
       MAX(CASE WHEN s.type = 3 THEN plannedDate END) Planned3,
       MAX(CASE WHEN s.type = 4 THEN plannedDate END) Planned4,
       MAX(CASE WHEN s.type = 1 THEN finalDate   END) Final1,
       MAX(CASE WHEN s.type = 2 THEN finalDate   END) Final2,
       MAX(CASE WHEN s.type = 3 THEN finalDate   END) Final3,
       MAX(CASE WHEN s.type = 4 THEN finalDate   END) Final4,
       MAX(CASE WHEN s.type = 1 THEN isApproved  END) App1,
       MAX(CASE WHEN s.type = 2 THEN isApproved  END) App2,
       MAX(CASE WHEN s.type = 3 THEN isApproved  END) App3,
       MAX(CASE WHEN s.type = 4 THEN isApproved  END) App4
  FROM salesorderStatus s JOIN salesorders o
    ON s.orderId = o.id JOIN customers c
    ON o.customerId = c.id JOIN users u 
    ON o.salesmanId = u.id
 GROUP BY o.orderNo, c.name, u.name, o.orderdate
 ORDER BY o.orderNo DESC

出力例:

+---------+--------------+--------------+--------- ---+------------+------------+------------+------- --+------------+------------+------------+----- -------+------+------+------+------+
| | 注文番号 | 顧客名 | セールスマン名 | 注文日 | 計画中1 | 計画中2 | 計画中3 | 計画中4 | ファイナル1 | ファイナル2 | ファイナル3 | ファイナル4 | アプリ1 | アプリ2 | アプリ3 | アプリ4 |
+---------+--------------+--------------+--------- ---+------------+------------+------------+------- --+------------+------------+------------+----- -------+------+------+------+------+
| | E1015 | マイクロソフト | シュテファン | 2013-10-01 | 2013-10-01 | 2013-10-01 | 2013-10-01 | 2013-10-01 | 2013-10-15 | 2013-10-15 | 2013-10-15 | 2013-10-15 | 1 | 0 | 1 | 0 |
| | E1014 | のみ | アンダース | アンダース 2013-10-01 | 2013-10-01 | 2013-10-01 | 2013-10-01 | 2013-10-01 | 2013-10-15 | 2013-10-15 | 2013-10-15 | 2013-10-15 | 1 | 0 | 1 | 0 |
| | E1013 | 専門家 | トーマス | 2013-10-01 | 2013-10-01 | 2013-10-01 | 2013-10-01 | 2013-10-01 | 2013-10-15 | 2013-10-15 | 2013-10-15 | 2013-10-15 | 1 | 0 | 1 | 0 |
...
+---------+--------------+--------------+--------- ---+------------+------------+------------+------- --+------------+------------+------------+----- -------+------+------+------+------+

これがSQLFiddleのデモです

于 2013-11-05T20:11:04.787 に答える