我有3张桌子:
活动,工具,因为它们共享一个n:m关系表 activities_tools 。
我网站上的用户可以选择过滤器上的可用工具。我现在正试图获得所有相关工具可用的活动。
所以,例如如果我选择ID为1和2的工具,我应该得到的活动要求不需要工具,工具1,工具2以及需要两者的活动。因此,应排除需要其他工具的活动。
到目前为止,我尝试过的查询看起来像这样:
SELECT activities.*, GROUP_CONCAT(tool) AS tools
FROM activities
LEFT JOIN activities_tools ON activities_tools.activity = activities.id
WHERE ISNULL(tool) OR tool IN (1,2)
GROUP BY activities.id
(1,2)是用户选择的id列表。
ISNULL部分解决了获取未应用工具的活动的问题。我现在的问题是,例如如果只有其中一个工具可用,则根据需要返回工具1和2的工具。
如何一次检查多个值?我试过摆弄GROUP_CONCAT + HAVING + FIND_IN_SET等等......但是我无法提出解决方案。
感谢任何帮助。
答案 0 :(得分:0)
我认为您可以使用额外的NOT IN检查:
<input id="avatar" class="form-control" type="file" name="image">
答案 1 :(得分:0)
在尝试了更多的东西并考虑来自这里的输入后,我找到了我的解决方案:)
SELECT activities.*, GROUP_CONCAT(tool) AS tools
FROM activities
LEFT JOIN activities_tools ON activities_tools.activity = activities.id
GROUP BY activities.id
HAVING ISNULL(tool) OR FIND_IN_SET(1, tools) = 0 OR FIND_IN_SET(2, tools) = 0 etc.
“OR FIND_IN_SET(1,tools)= 1”部分是要排除的ID。这部分查询是在PHP中动态生成的。
编辑:
在这里阅读了一个超酷的技巧:
MySQL find_in_set with multiple search string
我已经调整了我的解决方案:
SELECT activities.*, GROUP_CONCAT(tool) AS tools
FROM activities
LEFT JOIN activities_tools ON activities_tools.activity = activities.id
GROUP BY activities.id
HAVING CONCAT(",", toys, ",") NOT REGEXP ",(x|y|z),"
其中x,y和z等于排除id。这样查询就会缩短。