[英]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;"
SELECT * FROM
在技術上是偽SQL(在執行命令之前解釋器必須修改的sql命令。最好養成在SELECT
語句中指定列的習慣。
連接是使關系數據庫如此有用和強大的原因。 學習它們。 愛他們。
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
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.