2012-10-15 23 views
1

我一直在寻找这个太久,我已经失去了逻辑的所有能力。指针/非常感谢。查询获取不在列表中的项目,但与列表中的项目有关

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

表:类别

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

表:产品

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

表:Prodcats

+-----+-------+ 
| 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若要一种产品,是在CATID 1

这就是我的头打破了返回(包含字符串“”),但只有当他们是相关的(在prodcats)类别2和5。

这可能是有用的了解以下内容:

  • 在$ mycats这些ID可能会或可能不会出现在产品表PCAT。
  • $ mycats中只有一个或两个项目 - 如果有两个项目,一个将始终是一个名称中包含我正在寻找的字符串的猫,第二个永远不会。

编辑: - 添加上面的示例表数据和下面的一个例子,使这个更清晰。

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

我需要得到CATID 4 - 他们的名字都包含字符串 ''。这很简单。

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

我希望能让它更清楚一点。这点对我来说就像泥巴。

+0

两个问题;是pCat(在产品表中)一个ID?并且我可以假设该pCat不在该pID的prodcats表中? – caitriona

+0

我用更好的表格轮廓和希望更清晰的例子更新了这个问题。你是对的,产品表中的pCat不会出现在与pId相关的产品中。 – Katherine

+0

用提交SQL查询的编程语言实现这种逻辑会更容易。 否则,您可以尝试为您的catID 2和5设置单独的查询,然后使用'UNION'加入结果。 – coproc

回答

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条件将执行所有可能的加入后,这意味着更多的连接。底线:这种方式要快得多
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%';