[英]MYSQL SELECT with JOIN, COUNT and GROUP BY
我已經更改了我的 mysql 結構,並且過去使用SUM CASE列鍵索引進行了此查詢:
SELECT
orders.id,
orders.tool_id,
date(orders.date_placement) AS cdate,
CAST(orders.date_placement AS DATE) AS lala,
positions.id,
positions.optionindex,
positions.keyindex,
tools.id,
tools.tool_name,
tools.tool_number,
SUM(CASE WHEN keyindex=1 THEN 1 ELSE 0 END) AS value1,
SUM(CASE WHEN keyindex=2 THEN 1 ELSE 0 END) AS value2,
SUM(CASE WHEN keyindex=3 THEN 1 ELSE 0 END) AS value3,
SUM(CASE WHEN keyindex=4 THEN 1 ELSE 0 END) AS value4,
DATE_FORMAT(orders.date_placement, '%Y-%m') AS nicecdate
FROM orders
LEFT JOIN tools
ON tools.id=orders.tool_id
LEFT JOIN positions
ON positions.order_id=orders.id
WHERE
tools.id = ?
group by DATE_FORMAT(orders.date_placement, '%Y-%m')
此查詢的結果如下:
ID | value1 | value2 | value3 | nicedate
1 | 1 | 1 | 4 | 2018-09
2 | 0 | 0 | 1 | 2018-10
3 | 1 | 1 | 1 | 2018-11
4 | 2 | 0 | 0 | 2018-12
在前端創建一些堆疊圖表很好。
但是現在我添加了一個帶有映射值(ID1=value1,ID2=value2,....)的附加表(repkey),並且除了 keyindex 之外,我還向第一個表keyindex2添加了一個新列。
ID | keyindex1 | keyindex2 | created
1 | 1 | 27 | 2019-01
2 | 1 | 27 | 2019-01
3 | 2 | 25 | 2019-02
4 | 1 | 27 | 2019-03
5 | 10 | 27 | 2019-04
因此,我需要基於相應月份的 keyindex 和 keyindex2 的每個組合:
ID | keyindex1 | keyindex2 | Value |count |created
1 | 1 | 27 | value1 value27 | 2 |2019-01
2 | 2 | 25 | value2 value25 | 1 |2019-02
3 | 1 | 27 | value1 value27 | 1 |2019-03
4 | 10 | 27 | value10 value27 | 1 |2019-04
這是我嘗試過的,但我不知道如何計算相應月份的 keyindex 和 keyindex2 的組合。 結果也與舊結構的結果不同,所以我完全不確定這個查詢是否完全符合我的要求。
SELECT
orders.id,
orders.tool_id,
date(orders.date_placement) AS cdate,
CAST(orders.date_placement AS DATE) AS lala,
positions_list.id AS POSITIONID,
positions_list.order_id AS POSITIONORDERID,
positions_list.keyindex,
positions_list.keyindex2,
RepK.keynr,
RepK.content AS repcontent,
RepK.p_company,
RepK2.keynr,
RepK2.content AS repcontent2,
RepK2.p_company,
COUNT(positions_list.keyindex) AS count,
COUNT(positions_list.keyindex2) AS count2,
DATE_FORMAT(orders.date_placement, '%Y-%m') AS nicecdate
from orders
JOIN tools
ON tools.id=orders.tool_id
JOIN positions_list
ON positions_list.order_id = orders.id
JOIN repkey as RepK
ON RepK.keynr=positions_list.keyindex
AND RepK.p_company=orders.comp_id
JOIN repkey AS RepK2
ON RepK2.keynr=positions_list.keyindex2
WHERE
tools.id =:id
group by DATE_FORMAT(orders.date_placement, '%Y-%m')
順便說一句:這個查詢很慢(超過 10 秒)。 Web 服務器/數據庫位於帶有 ssd 的 nginx 上,因此問題必須出在我的查詢中。 JOINS 是原因嗎?
當您的需求變化如此之大以至於您的查詢的輸出和結構不再相同時,最好與現有代碼保持一定距離,並從零開始思考。
您需要計算相應月份的 keyindex 和 keyindex2 的組合。
我們不知道您的數據庫,但這個簡單的需求強烈暗示支持如下所示的解決方案:
SELECT
positions_list.keyindex,
positions_list.keyindex2,
DATE_FORMAT(orders.date_placement, '%Y-%m') AS nicedate,
COUNT(*) as count,
--...more columns
from orders
JOIN tools
ON tools.id=orders.tool_id
JOIN positions_list
ON positions_list.order_id = orders.id
JOIN repkey as RepK
ON RepK.keynr=positions_list.keyindex
AND RepK.p_company=orders.comp_id
JOIN repkey AS RepK2
ON RepK2.keynr=positions_list.keyindex2
WHERE
tools.id =:id
group by DATE_FORMAT(orders.date_placement, '%Y-%m'),positions_list.keyindex,positions_list.keyindex2
將您想要單獨計算的列放在GROUP
,它應該可以解決問題。 現在,根據您的表關系以及您想要計算的內容, COUNT
可能需要一些工作(例如,如果您想計算不同的訂單,您可能需要使用COUNT(DISTINCT orders.id)
),但您會得到要旨。
另外,請花一些時間確保在每個表之間充分使用JOIN
(= INNER JOIN
) 和LEFT JOIN
,這將幫助您獲得所需的結果。
至於性能,是的 JOIN 會影響您的查詢所花費的時間,但為了幫助您,我們需要另一個主題和您的數據庫的詳細信息(最重要的是:索引!您已經可以自己檢查了)。 還有一個專供 DBA 使用的 SE 站點。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.