使用左连接搜索select中的多行

时间:2011-05-16 15:07:13

标签: mysql select join

我有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'它的工作原理。所以我只能通过一个标签进行搜索,我解释了查询,并说它不可能在哪里。

如何使用单个查询搜索多个标签?

谢谢!

4 个答案:

答案 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'