查询以获取不在ID列表中但与列表中的项目相关的项目

时间:2012-10-15 01:12:31

标签: mysql

我一直在看这个问题太久了,而且我已经失去了所有的逻辑能力。指针/帮助非常感谢。

我有三个表,如下所示,列很重要。

表:类别

+-------+--------------+
| catID | catName      |
+-------+--------------+
|     1 | somename     |
|     2 | stringname   |
|     3 | thirdcat     |
|     4 | stringcat    |
|     5 | stringother  |
|     6 | sixthcat     |
+-------+--------------+

表:产品

+-----+------+
| pID | pCat |
+-----+------+
|  22 |    1 |
|  33 |    1 |
|  44 |    7 |
|  55 |    9 |
+-----+------+

表:产品

+-----+-------+
| pID | catID |
+-----+-------+
|  22 |     2 |
|  22 |     6 |
|  33 |     3 |
|  33 |     5 |
|  44 |     3 |
|  44 |     6 |
|  55 |     5 |
|  55 |     6 |
+-----+-------+

我有一个类别ID列表。我需要使用此列表返回catName中具有特定字符串的类别。

如果(来自类别)我想要将类别添加到此列表中:

catName LIKE %string% AND catID IN ($mycats) 

显然没问题。

但是,我还需要返回类别2和5(包含“字符串”),但只有它们(在prodcats中)2与catID 1中的产品相关。

这就是我的脑袋坏了。

了解以下内容可能很有用:

  • $ mycats中的ID可能会也可能不会作为产品表中的pCat出现。
  • $ mycats中只有一个或两个项目 - 如果有两个,一个将永远是一个猫,其名称包含我要找的字符串,第二个永远不会。

已编辑: - 上面添加了样本表数据,下面是一个示例,以便更清楚。

一个例子是: $ mycats = 1,4

我需要获得catID 4 - 其名称都包含'string'。这很容易。

但我也想获得catID 2和5,因为它们也包含字符串,虽然不在$ mycats中,但它们附加到产品中catID 1的表prodcats中的pID。

我希望这会让它更清晰一些。就此而言,这就像是泥巴。

2 个答案:

答案 0 :(得分:1)

您的要求中也包含的次要类别ID可表示为:

select c.*
from Product p
join Prodcats pc on pc.pID = p.pID
join Categories c on c.catID = pc.catId and c.catName like '%string%'
where pCat in (1,4)

现在您只需使用原始查询union

select *
from Categories = pc.catId 
where catID in (1,4)
and c.catName like '%string%'
union
select c.*
from Product p
join Prodcats pc on pc.pID = p.pID
join Categories c on c.catID = pc.catId and c.catName like '%string%'
where pCat in (1,4)

注意:

  • union会自动删除重复项,因此无需distinct。 (union all保留重复项)
  • 此查询应该执行得非常好 - 类别的两个路径位于单独的查询中,因此优化会很好
  • 类别名称的条件在联接的on子句中,因为这样的子句在进行连接时执行 ,而将条件放在where cluase中将是在完成所有可能的连接后执行 ,这意味着会进行更多的连接。底线:这样快得多

答案 1 :(得分:0)

好吧,我我已经弄明白你在追求什么。

诀窍是向后工作。首先获取通过产品链接的类别(使用下面的associatedCategories派生表选择)。然后加入反对与字符串匹配的类别。

select * from
categories
inner join (
    select catID from
    products
    inner join prodcats on products.pID = prodcats.pID
    where
    pCat in (1,4)
) associatedCategories on categories.catID = associatedCategories.catID
where catName LIKE '%string%';