如何在group_concat字段中检查ID?

时间:2015-07-06 13:15:40

标签: php mysql

我有一个查询从某些表返回文件及其标签和子类别,我想要获取具有特殊标记ID的文件。

SELECT file.id,file.title,content,comments,likes,visit,
                    group_concat(distinct sub_category_name ) as subCategoryName,
                    group_concat(distinct sub_category.id ) as subCatId,
                    GROUP_CONCAT(distinct tag_name order by tag_id) as tag_name,
                    GROUP_CONCAT(distinct tag_id order by tag_id) as tags_id
                     FROM file
                    LEFT JOIN file_subcat on file_subcat.file_id= file.id
                    LEFT JOIN sub_category on sub_category.id=file_subcat.subcat_id
                    LEFT JOIN tag_file tf1 on tf1.file_id=file.id
                    LEFT JOIN tag on tag_id=tag.id
                    group by file.id
                    HAVING tags_id LIKE ?
                    ORDER BY file.id DESC

如果我使用此查询,如果tags_id等于6,则返回6,16,... 如何更改此查询以获取具有该标记ID的文件? 我不想从基础更改查询,因为我想显示每个文件标签和子类别,这个查询似乎有效,因为我不需要多个查询。 结果集是这样的

file_id      tags_id
 1           6,15,16
 2           7,20,26 
 3           8,9,10

如果我在表格中有这个,我可以使用In()但是因为得到这个结果我使用了group by和having似乎不能在having或者BETWEEN中使用子句。

3 个答案:

答案 0 :(得分:2)

喜欢这个问题,试试这个,

SELECT file.id,file.title,content,comments,likes,visit,
                    group_concat(distinct sub_category_name ) as subCategoryName,
                    group_concat(distinct sub_category.id ) as subCatId,
                    GROUP_CONCAT(distinct tag_name order by tag_id) as tag_name,
                    GROUP_CONCAT(distinct tag_id order by tag_id) as tags_id
                     FROM file
                    LEFT JOIN file_subcat on file_subcat.file_id= file.id
                    LEFT JOIN sub_category on sub_category.id=file_subcat.subcat_id
                    LEFT JOIN tag_file tf1 on tf1.file_id=file.id
                    LEFT JOIN tag on tag_id=tag.id
                    group by file.id
                    HAVING  FIND_IN_SET('16', tags_id)
                    ORDER BY file.id DESC

替换<'>无论你想要什么ID /值,我相信你会获取它 您也可以通过

排除GROUP_CONCAT中的特定值
 HAVING  !FIND_IN_SET('16', tags_id) 

答案 1 :(得分:1)

忘记使用连接值。为什么只能在以下情况下搜索字符串:

HAVING SUM(tag_id = ?) > 0

这样可以保存所有字符串操作。另外,如果tag_id是一个整数,您可以将数字作为数字进行比较,而不是在类型之间来回转换值。

答案 2 :(得分:0)

从阅读SQL开始,就好像您正在使用LIKE运算符一样。使用LIKE运算符将搜索类似于或等于指定变量(LET?= variable)的内容,尝试更改查询以使用直接比较运算符,例如=(等于),类似于;

SELECT file.id,file.title,content,comments,likes,visit,
                group_concat(distinct sub_category_name ) as subCategoryName,
                group_concat(distinct sub_category.id ) as subCatId,
                GROUP_CONCAT(distinct tag_name order by tag_id) as tag_name,
                GROUP_CONCAT(distinct tag_id order by tag_id) as tags_id
                 FROM file
                LEFT JOIN file_subcat on file_subcat.file_id= file.id
                LEFT JOIN sub_category on sub_category.id=file_subcat.subcat_id
                LEFT JOIN tag_file tf1 on tf1.file_id=file.id
                LEFT JOIN tag on tag_id=tag.id
                WHERE tags_id = ?
                group by file.id
                ORDER BY file.id DESC