我有3个表,产品,products_tags和标签。产品可以通过products_tags表连接到多个标签。
但是,如果我想现在使用多个标签搜索产品,我会进行如下查询:
SELECT
*
FROM
products
LEFT JOIN
products_tags
ON
products_tags.product_id = products.id
LEFT JOIN
tags
ON
products_tags.tag_id = tags.id
WHERE
tags.name = 'test'
AND
tags.name = 'test2'
哪个不起作用:(。 如果我删除AND tags.name ='test2'它的工作原理。所以我只能通过一个标签进行搜索,我解释了查询,并说它不可能在哪里。
如何使用单个查询搜索多个标签?
谢谢!
答案 0 :(得分:3)
你有没有试过像:
WHERE
(tags.name = 'test'
OR
tags.name = 'test2')
或
WHERE
tags.name in( 'test', 'test2')
因为即使您将一个产品加入多个代码,每个代码记录也只有name
的一个值。
答案 1 :(得分:2)
你需要加入两次才能进行测试和测试2:
select products.*
from products
join product_tags as product_tag1 on ...
join tags as tag1 on ...
join product_tags as product_tag2 on ...
join tags as tag2 on ...
where tag1.name = 'test'
and tag2.name = 'test2'
对于test或test2,您需要一个join和一个in子句以及一个不同的:
select distinct products.*
from products
join product_tags on ...
join tags as tags on ...
where tags.name IN('test', 'test2')
答案 2 :(得分:1)
你必须通过和COUNT(*)进行分组,以确保找到全部(或多个)。 第一个查询(PreQuery)将产品标签表连接到标签,并查找相同的匹配标签以查找...然后使用它来连接到最终列表的产品
SELECT STRAIGHT_JOIN
p.*
FROM
( select pt.product_id
from products_tags pt
join tags on pt.tag_id = tags.id
where tags.name in ('test1', 'test2' )
group by pt.product_id
having count(*) = 2
) PreQuery
join products on PreQuery.Product_ID = Products.ID
答案 3 :(得分:1)
如果您正在搜索同时包含“test”和“test2”标签的产品,那么您需要每次加入product_tag和tag表两次。
此外,使用内部联接,因为您只需要具有这些标记的产品。
示例:
SELECT products.*
FROM products
INNER JOIN products_tags pt1 ON pt1.product_id = products.id
INNER JOIN products_tags pt2 ON pt2.product_id = products.id
INNER JOIN tags t1 ON t1.id = pt1.tag_id
INNER JOIN tags t2 ON t2.id = pt2.tag_id
WHERE t1.name = 'test'
AND t2.name = 'test2'