簡體   English   中英

多次連接同一張表以查看訂單的所有狀態

[英]Joining the same table multiple times to get a view of all statuses of an order

我有一點問題。 我已經開發了訂​​單管理系統。 作為一項新功能,用戶現在應該能夠在列表視圖中看到每個訂單的某些狀態。

我的表是這樣的:

命令:

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

如您所見-很多Left聯接,我希望可以用其他方式完成。 主要問題是此查詢非常慢。 我希望有人能幫助我。 提前致謝。

更新:您可以使用條件聚合

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

樣本輸出:

+---------+--------------+--------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------+------+------+------+
| orderNo | customerName | salesmanName | orderdate  | Planned1   | Planned2   | Planned3   | Planned4   | Final1     | Final2     | Final3     | Final4     | App1 | App2 | App3 | App4 |
+---------+--------------+--------------+------------+------------+------------+------------+------------+------------+------------+------------+------------+------+------+------+------+
| E1015   | MICROSOFT    | Steffen      | 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   | ONLY         | Anders       | 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   | EXPERT       | Thomas       | 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演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM