我的数据库中有以下两个表:
当我需要选择与某个标记($tag
)匹配的所有语句时,我使用此SQL查询:
$select = "SELECT Statements.id, Statements.name, Statements.link FROM Statements JOIN Tags ON Statements.id = Tags.probID AND Tags.tag = '$tag'";
现在我需要在同一时间选择与几个标签匹配的所有语句。我怎样才能做到这一点?我应该更改数据库中的内容吗?
答案 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)
您的原始问题只是查找存在某个标记的语句,或者换句话说,在另一个表中标记 的语句。因此,请使用EXISTS
或IN
。
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
);