2012-01-12 54 views
0

這是我當前的SQL查詢的「實例的版本」:MySQL如何根據用戶輸入的順序來連接表?

SELECT DISTINCT files.* FROM vw_files files 
LEFT JOIN tbl_file_ext fext 
ON files.id = fext.fileID 
INNER JOIN tbl_extensions ext ON fext.extensionID = ext.id 
WHERE ext.extension = 'exe' OR ext.extension = 'com' 

WHERE子句通過輸入一個逗號分隔的字符串用戶驅動。

我想什麼是通過輸入命令/組,這樣說,如果用戶輸入:

com, exe, jpg WHERE子句將是:

WHERE ext.extension = 'com' OR ext.extension = 'exe' OR ext.extension = 'jpg' 

的結果需要由優先級進行排序的輸入是這樣的:

File1 com exe jpg 
File2 com exe jpg 
File3 com exe 
File4 com jpg 
File5 com 

WHERE子句經由PHP構造,但我怎樣才能構建ORDERGROUP條款將根據usrs輸入的優先級來調整結果。根據要求

編輯----

以上只是一個例子,我說,和我做類似的東西計算器也沒覺得合適。然而,真正的設置如下:

tbl_solutions - ID,AUTHORID,ip地址,標題,問題,dateAdded,鎖定,積極

tbl_solution_tags - ID,FK solutionID,FK標籤識別

tbl_solution_files - ID,FK solutionID,FK FILEID

vw_solution_and_file - 用戶名,ID(溶液ID),AUTHORID,ip地址,標題,問題,dateAdded,鎖定,活性,文件名,檔案大小,取出,公共

select sol.*, files.fileName, files.fileSize, files.removed, files.public from 
tbl_solutions sol left join 
tbl_files files on (select sf.fileID from tbl_solution_files sf 
where sf.solutionID = sol.id) = files.id; 

vw_solution_file_tags - 與上述相同,但也返回標籤

SELECT sf.*,GROUP_CONCAT(tags.tag SEPARATOR ', ') as 'tags' FROM 
vw_solution_and_file sf LEFT JOIN tbl_solution_tags st 
ON sf.id = st.solutionID INNER JOIN tbl_tags tags 
ON st.tagID = tags.id GROUP BY sf.id 

從vw_solution_file_tags輸出示例:

用戶名ID AUTHORID ip地址標題問題dateAdded鎖定有源文件名檔案大小除去公共標籤

craig 24 81 127.0.0.1「A標題」「問題」2012-01-01 0 1 NULL NULL NULL 1 C++,ASP,gdb

克雷格25 81 127.0.0.1 「B標題」 「B的問題」 2012-01-01 0 1 NULL NULL NULL 1個C++,ASP時,Windows

所以此刻所有我做的是使用vw_solution_file_tags在我的頁面中,但用戶將能夠在標籤上應用過濾器。所以他可能會說ASP,Windows,所以上面的兩個結果都會顯示。但他們需要按用戶輸入的優先順序排列。

所以我想在我的PHP查詢中使用的代碼將類似於vw_solution_file_tags,但只有標籤匹配用戶輸入並按該輸入排序的位置。

+1

如果您可以通過PHP構造WHERE子句,爲什麼不能構造ORDER或GROUP BY子句? – 2012-01-12 08:19:20

+1

試一下'ORDER BY ext.extension ='com'DESC,ext.extension ='exe'DESC,ext.extension ='jpg'DESC' – bububaba 2012-01-12 08:20:42

+0

這不會給所有的COM然後EXE然後JPG嗎?我需要「com exe jpg」,「com exe」,「com,jpg」,「exe,jpg」,然後com-exe-.jpg等 – 2012-01-12 08:27:16

回答

1

我想你可能還必須從PHP代碼構造ORDER BY。試試像下面這樣。注意:首先直接在MYSQL上執行,如果它能正常工作,則將其移入PHP。

SELECT DISTINCT files.* FROM vw_files files 
LEFT JOIN tbl_file_ext fext 
ON files.id = fext.fileID 
INNER JOIN tbl_extensions ext ON fext.extensionID = ext.id 
WHERE ext.extension IN ('com', 'exe', 'jpg') 
ORDER BY 
    CASE 
     WHEN ext.extension = 'com' THEN 1 
     WHEN ext.extension = 'exe' THEN 2 
     WHEN ext.extension = 'jpg' THEN 3 
    END 
+0

要複雜得多,它選擇好,但是排序不起作用。你認爲我的Join可能有問題嗎?儘管如此,我確實嘗試了很多嘗試。 – 2012-01-12 10:01:39

+0

如果編輯問題併爲查詢中使用的所有表添加一些示例數據,它可能會有所幫助。當我們知道我們正在使用什麼輸入和輸出時,我們可以嘗試微調查詢。 – 2012-01-12 10:23:38

+0

它確實有用,謝謝。我只需要扭轉加入表格的順序,並在那裏放置一個組。謝謝 :-) – 2012-01-12 13:02:34