2017-09-06 136 views
1

我在MySQL數據庫,其結構的表上定義FILE_TYPE記錄及其項目類型和父節點編號是有點像MySQL查詢找到

id |parent_id| project_id | name | file_type 
------------------------------------------- 
1 | NULL | p1  | abc1 | f1 
2 | NULL | p1  | abc2 | f2 
3 | 1  | p1  | abc3 | f2 
4 | NULL | p2  | abc4 | f1 
5 | 1  | p1  | abc5 | f3 
6 | NULL | p2  | abc6 | f3 
7 | 4  | p2  | abc7 | f1 
8 | NULL | p1  | abc8 | f2 
9 | 7  | p2  | abc9 | f1 

我試圖獲取其PARENT_ID所有記錄必須NULL和PROJECT_ID必須是「P1」和FILE_TYPE可以是「F1」或「F2」

按我目前的進展這個查詢爲我工作

SELECT * FROM TestTable的WHERE(PROJECT_ID = 'P1' AND PARENT_ID是NULL AND FILE_TYPE = 'F1')OR(PROJECT_ID = 'P1' AND PARENT_ID IS NULL和 FILE_TYPE = 'F2');

有沒有更好的方法來獲取所需的記錄,如使用連接? 高性能的方法更可取。

另外,因爲我使用file_type來過濾記錄。

因此,在file_type列上添加一個索引會不會好?

數據類型此列是VARCHAR(50)

回答

0

你可以試試這個(也絕對沒有必要使用連接):

SELECT * FROM testtable 
WHERE project_id = 'p1' AND parent_id Is NULL AND file_type IN ('f1','f2') ; 
+0

'IN'是否與擁有百萬條記錄的表一起工作的正確方法? – prem

0

這應該工作:

SELECT 
    * 
FROM 
    testtable 
WHERE 
    parent_id IS NULL 
    AND project_id = 'p1' 
    AND file_type IN ('f1','f2') 
0
SELECT * FROM testtable WHERE project_id = 'p1' AND parent_id is NULL AND file_type in ('f1', 'f2'); 
0

project_id和上創建複合索引。使用UNION來優化響應時間。

SELECT * FROM testtable 
    WHERE parent_id IS NULL 
    AND project_id = 'p1' 
    AND file_type = 'f1' 
UNION 
SELECT * FROM testtable 
    WHERE parent_id IS NULL 
    AND project_id = 'p1' 
    AND file_type = 'f2' 

Index目的在OR條款的情況下被破壞。拆分查詢並使用UNION合併結果將肯定會完全使用索引。

+0

由於[在此](https://stackoverflow.com/a/13866221/3085520)上的SO UNION優先於在不同列上使用OR。我正在篩選出單列結果。聯盟是否仍然有意義? – prem

+0

是的。這是我個人的經歷。試試看 :) – Samir