PHP&MySQL:如何缩小标签搜索结果的范围?

PHP&MySQL:如何缩小标签搜索结果的范围?,php,mysql,sql,Php,Mysql,Sql,如何缩小标签搜索结果的范围 比如说, 根标签表 根\u mm\u标记的\u页面的表 我想得到pg_id为10的页面 我尝试使用下面的查询,但它返回空: SELECT * FROM root_tags LEFT JOIN root_mm_tagged_pages ON root_mm_tagged_pages.tag_id = root_tags.tag_id WHERE root_tags.tag_name = 'A' AND root_tags.tag_name = 'B' ORDER

如何缩小标签搜索结果的范围

比如说,

根标签表

根\u mm\u标记的\u页面的表

我想得到pg_id为10的页面

我尝试使用下面的查询,但它返回空:

SELECT *
FROM root_tags

LEFT JOIN root_mm_tagged_pages
ON root_mm_tagged_pages.tag_id = root_tags.tag_id

WHERE root_tags.tag_name = 'A'
AND root_tags.tag_name = 'B'

ORDER BY root_mm_tagged_pages.created_on DESC
注意:我得到了通过$\请求的值,所以它总是动态的。但是B总是固定的

有什么想法吗

谢谢

WHERE root_tags.tag_name = 'A'
AND root_tags.tag_name = 'B'
你的意思是或根标签。标签名称='B'

编辑Nvm,但关于:

WHERE root_tags.tag_name IN ('A', 'B')
从选择中选择** 从根目录\u mm\u标记的\u页面

连接根目录\u标记,如处所示 在At.tag_id=root_mm_taged_pages.tag_id上作为Aat联接

挑选* 从根目录\u mm\u标记的\u页面

将root_标记连接为Bt 在Bt.tag_id=root_mm_taged_pages.tag_id为Bbt ON Aat.pg_id=Bbt.pg_id上 其中Aat.tag_name='A'和Bbt.tag_name='B'

订单由Aat.created_在DESC上创建


我想这应该很慢,也许等下一个解决方案吧:

在我问的一个类似的问题中,尼克·鲁尔茨给出了一个非常令人满意的答案:

在您的情况下,它将是:

select pg_id
from root_mm_tagged_pages
where tag_id in ('A', 'B')
group by pg_id
having count(distinct(tag_id)) >= 2
这将返回至少具有标记“A”和“B”的任何结果

但是,如果您要使用更通用的案例搜索算法,我认为可以进行如下改进:

select pg_id
from root_mm_tagged_pages
where tag_id in (/* any amount of tags */)
group by pg_id
having count(distinct(tag_id)) > 0
order by count(distinct(tag_id)) desc

它将返回至少有1个匹配标记的每个结果,但首先返回具有最匹配标记的结果

我的答案来自汤米的暗示

SELECT * FROM 
( SELECT root_mm_tagged_pages.tag_id as Atag_id, root_mm_tagged_pages.pg_id as Apg_id, At.tag_name as Atag_name FROM root_mm_tagged_pages

LEFT JOIN root_tags as At ON At.tag_id = root_mm_tagged_pages.tag_id ) AS Aat JOIN

( SELECT root_mm_tagged_pages.tag_id as Btag_id, root_mm_tagged_pages.pg_id as Bpg_id,  Bt.tag_name as Btag_name FROM root_mm_tagged_pages

LEFT JOIN root_tags as Bt ON Bt.tag_id = root_mm_tagged_pages.tag_id ) AS Bbt on Aat.Apg_id = Bbt.Bpg_id WHERE Aat.Atag_name = 'A' AND Bbt.Btag_name = 'B'

谢谢

他想要搜索,这意味着A和B必须共存。我不明白。。。mySQL将测试每一行,当涉及到root_tags.tag_name='A'时,它将计算为true或false,如果为true,它将继续查看和root_tags.tag_name='B',然后将始终为false,因为它不能是两个值可能我不应该使用WHERE。。。测试了您编辑的版本,但仍然得到相同的结果…好的,那么您希望它使您返回的页面\u id具有相关的标记\u名称B,当且仅当存在具有相关标记\u名称A的相同页面\u id时?还是我误会了?抱歉搞混了。好的,那么你想要它,这样你返回的页面id就有了相关的标签名B,当且仅当存在具有相关标签名A的相同页面id时?是的。一个字段不能同时有两个值。我想你是不是想要,介于两者之间。谢谢。测试了它,但我得到一个错误-1054-未知列“root_tags.tag_id”在“on子句”…再次测试,我有一个打字错误,因为我只是复制和粘贴:再次感谢。编辑的版本现在有意义了!lol测试了它,但它返回了一个空结果…:谢谢对不起,我去睡觉了。刚刚醒来,测试了更新的版本,我有这个错误-1060-重复列名'tag_id'对不起!谢谢已测试两个建议的查询,但它们返回空结果…:
select pg_id
from root_mm_tagged_pages
where tag_id in ('A', 'B')
group by pg_id
having count(distinct(tag_id)) >= 2
select pg_id
from root_mm_tagged_pages
where tag_id in (/* any amount of tags */)
group by pg_id
having count(distinct(tag_id)) > 0
order by count(distinct(tag_id)) desc
SELECT * FROM 
( SELECT root_mm_tagged_pages.tag_id as Atag_id, root_mm_tagged_pages.pg_id as Apg_id, At.tag_name as Atag_name FROM root_mm_tagged_pages

LEFT JOIN root_tags as At ON At.tag_id = root_mm_tagged_pages.tag_id ) AS Aat JOIN

( SELECT root_mm_tagged_pages.tag_id as Btag_id, root_mm_tagged_pages.pg_id as Bpg_id,  Bt.tag_name as Btag_name FROM root_mm_tagged_pages

LEFT JOIN root_tags as Bt ON Bt.tag_id = root_mm_tagged_pages.tag_id ) AS Bbt on Aat.Apg_id = Bbt.Bpg_id WHERE Aat.Atag_name = 'A' AND Bbt.Btag_name = 'B'