我一直在看这个问题太久了,而且我已经失去了所有的逻辑能力。指针/帮助非常感谢。
我有三个表,如下所示,列很重要。
表:类别
+-------+--------------+ | 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 = 1,4
我需要获得catID 4 - 其名称都包含'string'。这很容易。
但我也想获得catID 2和5,因为它们也包含字符串,虽然不在$ mycats中,但它们附加到产品中catID 1的表prodcats中的pID。
我希望这会让它更清晰一些。就此而言,这就像是泥巴。
答案 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%';