选择同时匹配多个值的所有数据

时间:2016-04-02 17:07:48

标签: mysql sql

我的数据库中有以下两个表:

语句 enter image description here

和标签 enter image description here

当我需要选择与某个标记($tag)匹配的所有语句时,我使用此SQL查询:

$select = "SELECT Statements.id, Statements.name, Statements.link FROM Statements JOIN Tags ON Statements.id = Tags.probID AND Tags.tag = '$tag'";

现在我需要在同一时间选择与几个标签匹配的所有语句。我怎样才能做到这一点?我应该更改数据库中的内容吗?

2 个答案:

答案 0 :(得分:0)

您可以使用IN匹配代码,然后使用GROUP BY确保您拥有所有代码:

SELECT s.id, s.name, s.link
FROM Statements s JOIN
     Tags t
     ON s.id = t.probID 
WHERE t.tag IN ('$tag1', '$tag2', '$tag3')
GROUP BY s.id, s.name, s.link
HAVING COUNT(DISTINCT t.tag) = 3;

注意:上面的示例适用于三个标签。 HAVING子句中的数字需要与您要查找的标签数相匹配。

答案 1 :(得分:0)

戈登的回答很好。尽管如此,我想在这里给你一个建议:不要先养成加入所有内容的习惯,然后再思考如何获取数据。

您的原始问题只是查找存在某个标记的语句,或者换句话说,在另一个表中标记 的语句。因此,请使用EXISTSIN

select id, name, link
from statement
where id in (select probid from tags where tag = @tag);

你可以看到这比你的查询更直截了当,因为它的编写方式可能就像任务一样:从语句中选择数据,其中ID位于用@tag标记的ID集合中。

至于额外的要求,戈登的方式是完美的:查看标签中的ID(即按ID分组),找到具有所有标签的ID。这将上述声明改为:

select id, name, link
from statement
where id in 
(
  select probid 
  from tags 
  where tag in (@tag1, @tag2, @tag3)
  group by probid 
  having count(distinct tag) = 3
);