簡體   English   中英

SQL需要提高運行速度

[英]SQL need to improve run speed

我試圖通過數據庫中的日期字段從mysql中選擇數據。 (用戶可以輸入開始日期和結束日期)

對於用戶選擇日期之間的每個選定行,我需要從同一個表中選擇以產生結果。

例:

    $query = "SELECT * FROM table WHERE date BETWEEN $begindate AND $enddate"; //Select by date
    $result = mysqli_query($dbc,$query);
    while($row = mysqli_fetch_array($result)){
        vardump($row); //user needs to see all data between date selection
        $query = "SELECT * FROM table WHERE field = $row['field']";
        // and then do calculations with the data
    }

這運行得很慢,我明白為什么。 如何提高運行速度?

編輯:最初的目的是在日期之間生成銷售報告。 現在,用戶希望報告生成另一個結果。 只能通過搜索同一個表來生成此結果,並且我需要的行不在日期選擇范圍內。

編輯2:我確實需要在日期選擇之間輸出整個表格。 每一行都需要找到所有其他行,其中field = field,在日期選擇的內部或外部。

編輯3:解決了問題。 盡管我認為所選答案與我的問題最相關,但所有答案都有幫助。 但是,我相信在使用兩個表時使用join是正確的方法。 對於我的問題,我實際上只是通過復制表並對重復的表運行我的搜索來解決它。 所選答案對我不起作用,因為第二個查詢選擇不是第一個查詢選擇的一部分。 希望這可以幫助任何人看這篇文章。 再次感謝所有的幫助!

那么,如果你真的在同一個表中尋找這樣的條件,我建議你應該使用IN選擇器,如下所示:

$query = "SELECT * FROM table 
           WHERE field IN 
               (SELECT DISTINCT field FROM table 
                WHERE 
                    date BETWEEN $begindate AND $enddate)";

所以最終代碼看起來如下:

    $query = "SELECT * FROM table 
           WHERE field IN 
               (SELECT DISTINCT field FROM table 
                WHERE 
                    date BETWEEN $begindate AND $enddate)";
    $result = mysqli_query($dbc,$query);
    while($row = mysqli_fetch_array($result)){
        // do calculations with the $row
    }

我想你的表名不是TABLE

只是用戶inner join

 $query = "SELECT * 
           FROM table1
           JOIN table2 
             ON table1.field = table2.field
           WHERE date BETWEEN $begindate AND $enddate
           ORDER BY table1.field;"

停止編寫偽SQL

SELECT * FROM在技​​術上是偽SQL(在執行命令之前解釋器必須修改的sql命令。最好養成SELECT語句指定列的習慣。

使用SQL連接

連接是使關系數據庫如此有用和強大的原因。 學習它們。 愛他們。

您的一組SQL查詢,組合成一個查詢:

SELECT 
    table1.id as Aid, table1.name as Aname, table1.field as Afield,
    table2.id as Bid, table2.name as Bname, table2.field 
FROM table table1
LEFT JOIN table table2 
    ON table1.field = table2.field
WHERE table1.date BETWEEN $begindate AND $enddate
ORDER BY table1.id, table2.id

您生成的數據打印應該會生成訪問每組數據的內容,類似於:

$previous_table1_id = 0;
while($row = mysqli_fetch_array($result)){
    if ($row['Aid'] != $previous_table1_id) {
        echo 'Table1: ' . $row['Aid'] . ' - ' . $row['Aname'] . ' - '. $row['Afield'] . "\n";
        $previous_table1_id = $row['Aid'];
    }

    echo 'Table2: ' . $row['Bid'] . ' - ' . $row['Bname'];
}

處理匯總數據

數據聚合(對於field1 / table2在field上的多個匹配)是一個復雜的主題,但重要的是要了解。 現在,我會告訴你:

以下是匯總數據之一的簡化​​示例,以及使用它的無數方法之一。

Contents of Table
id |  name  |  field
--------------------
1  |  foos  |  whoag 
2  |  doh   |  whoag
3  |  rah   |  whoag
4  |  fun   |  wat
5  |  ish   |  wat

Result of query I gave you
Aid | Aname | Afield | Bid | Bname
----------------------------------
1   | foos  | whoag  | 1   | foos
1   | foos  | whoag  | 2   | doh
1   | foos  | whoag  | 3   | rah
2   | doh   | whoag  | 1   | foos
2   | doh   | whoag  | 2   | doh
2   | doh   | whoag  | 3   | rah
3   | rah   | whoag  | 1   | foos
3   | rah   | whoag  | 2   | doh
3   | rah   | whoag  | 3   | rah
4   | fun   | wat    | 4   | fun
4   | fun   | wat    | 5   | ish
5   | ish   | wat    | 4   | fun
5   | ish   | wat    | 5   | ish

GROUP BY縮小結果集的示例

    SELECT table1.id as Aid, table1.name as Aname
           group_concat(table2.name) as field
    FROM table table1
    LEFT JOIN table table2 
        ON table1.field = table2.field
    WHERE table1.date BETWEEN $begindate AND $enddate
    ORDER BY table1.id, table2.id
    GROUP BY Aid

Aid | Aname | field
----------------------------------
1   | foos  | foos,doh,rah
2   | doh   | foos,doh,rah
3   | rah   | foos,doh,rah
4   | fun   | fun, ish
5   | ish   | fun, ish

暫無
暫無

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

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