1

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

我有如下三个表,其中的列很重要。

表:类别

+-------+--------------+
| 猫ID | 猫名 |
+-------+--------------+
| 1 | 某人名 |
| 2 | 字符串名 |
| 3 | 第三只猫 |
| 4 | 字符串猫 |
| 5 | 弦其他 |
| 6 | 第六猫 |
+-------+--------------+

表:产品

+-----+------+
| 标识符 | 猫 |
+-----+------+
| 22 | 1 |
| 33 | 1 |
| 44 | 7 |
| 55 | 9 |
+-----+------+

表:产品目录

+-----+-------+
| 标识符 | 猫ID |
+-----+-------+
| 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 可能会或可能不会在 products 表中以 pCat 的形式出现。
  • $mycats 中只会有一个或两个项目 - 如果有两个,一个永远是一只猫,它的名字包含我正在寻找的字符串,第二个永远不会。

已编辑: - 添加了上面的示例表数据和下面的示例,以使这一点更清楚。

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

我需要得到 catID 4 - 其名称都包含“字符串”。这很容易。

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

我希望这让它更清楚一点。在这一点上,这对我来说就像泥泞。

4

2 回答 2

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子句中将在所有可能的连接完成后执行,这意味着要进行更多的连接。底线:这种方式要快得多
于 2012-10-15T16:02:56.747 回答
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%';
于 2012-10-15T15:48:00.987 回答