2012-01-12 79 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

相关问题