MySQL查询问题 - 在连接表上匹配多个id

时间:2017-12-10 00:19:10

标签: php mysql mysqli

我有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等等......但是我无法提出解决方案。

感谢任何帮助。

2 个答案:

答案 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。这样查询就会缩短。