簡體   English   中英

帶有 JOIN、COUNT 和 GROUP BY 的 MYSQL SELECT

[英]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.

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