我現在面臨一個MySQL問題的項目MySQL查詢優化: 我有一個MySQL表至極包含這些列,它的存儲中的每個訂單和訂單的每一個狀態:爲按日期排序與國家
id_order_history/id_employee/id_order/id_order_state/date_add
我想獲得* id_order *的列表,這些列表在特定的* id_order_state *中 - 比方說10 - 但我不想獲取狀態在這個特定狀態之後改變並且不想收集訂單少於7天...
這是我該如何做到這一點:
首先查詢來獲取訂單列表&日期:
SELECT id_order, date
FROM '._DB_PREFIX_.'ps_order_history,
WHERE TO_DAYS(NOW()) - TO_DAYS(date_add) <= 7
AND id_order_state = 10
然後循環只得到了令行禁止最新狀態:
$query = ' SELECT id_order, date
FROM '._DB_PREFIX_.'ps_order_history,
WHERE ';
foreach ($listAbove, $item) {
$query =+ '
((date > $item['date'])
AND (id_order = $item['id']))
';
}
$orderlist = Db::getInstance()->ExecuteS($query);
這不是真正的優化,我敢肯定,我可以只用一個查詢來做,但不知道如何。
您是否知道如何使這種清潔劑?例如,
這個解決方案看起來不錯,我唯一要改變的地方就是推薦OP將where子句的第二部分改爲AND ANDPh.date_add <= DATE_SUB(DATE(NOW()),INTERVAL 7 DAY )'這將允許在'date_add'字段使用索引,而當前的方法不會。 –
@MikeBrant這是一個很好的建議,那部分肯定需要工作。我認爲簡單的日期扣除可能不會完全達到他想要的效果,但是您可以在7.1天前發佈一些內容,但運行'TO_DAYS'時在技術上仍然在7天內。但是你肯定對索引的使用是正確的 –
如果最終的願望是根據實際的特定日曆日(從午夜開始)顯示'date_add'值,我建議的解決方案就好了,因爲你基本上計算當天的00:00:00(因爲'DATE(NOW())'),並將其用作與'date_add'的比較。對我而言,從邏輯的角度來看,這更清晰。 –