我有一个查询从某些表返回文件及其标签和子类别,我想要获取具有特殊标记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中使用子句。
答案 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