MySQL如何根据连接表的用户输入进行排序?

时间:2012-01-12 08:14:05

标签: php mysql sql

这是一个"示例版本"我当前的SQL查询:

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输入的优先级排序结果。

按要求编辑----

以上只是我所说的一个例子,并且我觉得不合适,因为我正在做类似stackoverflow的事情。但是,真正的设置如下:

tbl_solutions -  id,authorID,ipAddress,title,question,dateAdded,locked,active

tbl_solution_tags -   id,FK solutionID,FK tagID

tbl_solution_files -  id,FK solutionID,FK fileID

vw_solution_and_file -  username,id(解决方案ID),authorID,ipAddress,title,question,dateAdded,locked,active,fileName,fileSize,removed,public

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的输出示例:

username id authorID ipAddress title question dateAdded locked active fileName fileSize removed public tags

craig 24 81 127.0.0.1" A Title" "一个问题" 2012-01-01 0 1 NULL NULL NULL 1 c ++,ASP,gdb

craig 25 81 127.0.0.1" B Title" " 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 个答案:

答案 0 :(得分: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