这是一个"示例版本"我当前的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构造的,但是我如何构造一个ORDER
或GROUP
子句,它将按照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类似,但仅限于标记与用户输入匹配并按该输入排序的位置。
答案 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