2017-03-17 117 views
-2
product_options 
ID | Option 
1 | One 
2 | Two 
3 | Three 

product_to_options 
ID | Product | Option 
1 | 1  | 1 
2 | 2  | 2 
3 | 2  | 3 

从本质上讲,我需要从product_options得到所有行,除了所提供,其中选择都在同类产品中 的。其中连接表中选择行具有相同的价值

例如:

传递的值为1,将返回什么。

传递的值为2,将ID为3

路过的3的值返回的选项,将与ID返回选项2

+1

谁是你的例子中的“价值”? ID,产品还是选项? –

+0

@JuanCarlosOropeza值将是选项 –

+0

是混乱,因为你有两个'选项'一个整数和一个字符串。你应该重命名第二个'Option_ID' –

回答

0

您可以加入一个表与自身,过滤左表中的值并返回右表中的值。

SELECT 
    pto2.Option 
FROM 
    product_to_options pto1 
    INNER JOIN product_to_options pto2 
    ON pto1.Product = pto2.Product 
    AND pto1.ID <> pto2.ID 
WHERE 
    pto1.option = @option; 

您应该注意,根据数据您可以获得多个值。

Here's a working sample with minor syntax changes for sql server(你需要检查文本仅-结果或通过点击网格)

+0

如果我想获得选项'1'和选项'2'的选项,我应该怎么做? –

+0

@RyanHipkiss这是一个不同的问题。通常你使用一个IN和一个计数。请参阅http://stackoverflow.com/a/18860401/119477 –

1

我尽力用我的理解。

  • pto.Product = @option让你得到所有的行匹配@option
  • pto.Option <> @option但过滤那些具有相同ID

SELECT po.* 
FROM product_options po 
JOIN (
     SELECT pto.Option 
     FROM product_to_options pto 
     WHERE pto.Product = @option 
     AND pto.Option <> @option 
    ) as filter 
    ON PO.ID = filter.Option 
+0

不知道为什么你在这里使用内联视图,但至少它正确地筛选出具有相同ID的选项 –

+0

@ConradFrix不确定你的意思,但如果你看到一个更好的方式来编写它可以自由地将其作为第二种方式进行编辑。 –

相关问题