2011-08-12 35 views
0

我有一些單獨運行良好的查詢。這些查詢中的每一個涉及用戶在搜索結果時可能想要使用的不同類型的過濾器。每個查詢都會從數據庫中的5個表中獲得完全相同的列。我想達到的目標是累積使用過濾器(即通過日期和名稱等搜索,或通過地點和狀態進行搜索)累計MySQL查詢。我如何使用多個FROM語句?

我遇到的問題是將單個查詢放在一起以便可以將結果用作下一個查詢的起點。我已經閱讀了相交以及如何在MySQL中實現,但我不認爲我想要這樣做,因爲爲了做到這一點,我將不得不全部運行所有查詢,然後找到需要的交集。很多時間。

我想從我認爲最小的查詢開始,然後獲取結果,然後將這些結果作爲下一個查詢的起點。這可能是下一個查詢必須爲每個過濾器搜索5000個記錄的多個表之間的差異,或者將結果精簡到少於200個查詢,並且下一個查詢已經有了可以使用的表格。

我想我可能是能夠使用的語法如:

SELECT * FROM 
    (SELECT * FROM table1, table2, table3 WHERE DATE(trans_date) 
    BETWEEN DATE(from_date) AND DATE(to_date) 
     FROM (SELECT * FROM table1, table2, table3 
     WHERE name = "Joe" AND lname = "Bloggs")) 
WHERE status = "Open" 

這可能嗎?

非常感謝

+2

你爲什麼不只是讓像SELECT *語法FROM表1,表2,表3 WHERE DATE(TRANS_DATE)之間date(FROM_DATE)及日期(to_date)AND name =「Joe」AND lname =「Bloggs」AND status =「Open」...不需要子查詢imho –

+1

我同意漢斯。這聽起來像是一個過早優化的例子。性能方面,您不應該像這樣嵌套查詢。如果您的表具有適當的索引,則可以將所有條件放在一個WHERE子句中,並且查詢優化器將能夠制定最佳過濾策略。 – Simon

+0

如果你真的有五個具有完全相同列的表,我認爲你有一個數據建模問題。數據是否被分割(每個表中的不同鍵)或重疊(每個表中的相同鍵但非關鍵數據的不同列/值)? – APC

回答

1

一般 - 是的。雖然大多數RDBMS想要內的每個子查詢IIRC一個別名,像

SELECT * 
FROM (
SELECT * 
FROM .... 
WHERE ... 
) AS sub1