【发布时间】:2012-11-09 17:00:20
【问题描述】:
我有一个页面显示上传到我系统上的文件的“文件标签”。每个文件都可以有 0、1 或多个与之关联的文件标签。
我已经成功制作了一个显示文件名及其标签的页面,例如:
File Tag(s)
File#1 None
File#2 TAG1
File#3 TAG1, TAG2
此 SQL 查询将有助于生成上述数据:
SELECT *, GROUP_CONCAT(`ftg_name` ORDER BY `ftg_name` SEPARATOR ', ')
AS `x_file_tag_names`
FROM `file` LEFT JOIN `link_file_filetag` ON `fileftg_file` = `file_id`
LEFT JOIN `filetag` ON `ftg_id` = `fileftg_filetag`
GROUP BY `fileftg_file` ORDER BY `file_created` DESC;
问题:
我刚刚在页面顶部实现了过滤器。过滤器允许我在系统中的不同文件标签之间进行选择。当有人选择过滤器时,我会在 WHERE 子句中添加一个条件。看看这个查询:
SELECT *, GROUP_CONCAT(`ftg_name` ORDER BY `ftg_name` SEPARATOR ', ')
AS `x_file_tag_names` FROM `file`
LEFT JOIN `link_file_filetag` ON `fileftg_file` = `file_id`
LEFT JOIN `filetag` ON `ftg_id` = `fileftg_filetag`
WHERE `fileftg_filetag` = '1'
GROUP BY `fileftg_file` ORDER BY `file_created` DESC;
这会在我的页面上产生这个结果:
File Tag(s)
File#1 None
File#2 TAG1
File#3 TAG1
这里的问题是我仍然希望它为File#3 列出TAG1, TAG2。但当然,WHERE 条件正在摆脱TAG2。
我想知道是否有只涉及更改 SELECT 条件的解决方案。我试图创建一个看起来像这样的解决方案:
SELECT *, IF(ISNULL(`filetag_file`), 'None',
(//a subquery that gets all file tags associated with file in outer query))
【问题讨论】:
-
请不要使用
SELECT *。此外,您知道,如果您指定的列不是GROUPed,或者在聚合中,列的实际值是未定义的?