2015-07-11 130 views
1

我試圖從數據透視表中獲取一組值,其中列A等於值的數組,因此例如ID 12有attribute_value_id等於3和9.可以這樣做嗎?如果我使用and然後我沒有得到任何值我走了這麼遠......Mysql其中列A = X和列B = Y和或列B = Z

ID | post_id | attribute_id | attribute_value_id 
8  12   1    3 
9  12   2   13 
10  13   1    3 
11  13   2    9 
12  16   1    3 
13  16   2    9 
88  11   1    1 
89  11   2    8 
90  11   3   18 
91  11   4   22 

查詢...

select * 
from `searching_for_posts` 
where (
    select count(*) 
    from `attributes` 
    inner join `searching_for_attributes` 
    on `attributes`.`id` = `searching_for_attributes`.`attribute_id` 
    where `searching_for_attributes`.`searching_for_post_id` = `searching_for_posts`.`id` 
    and (`attribute_value_id` = 3 and `attribute_value_id` = 9) 
) >= 1 

。如果我使用or那麼我得到3個值,但它應該返回2.我有有限的SQL體驗。

+0

'(\'attribute_value_id \'= 3 \'attribute_value_id \'= 9)'是邏輯上是不可能....'attribute_value_id'不能同時擁有'3'和'9'作爲它的值,你是不是指''(\'attribute_value_id \'= 3或'attribute_value_id \'= 9)....或者你意思是'(\'attribute_value_id \'IN(3,9)' –

+0

@MarkBaker不,我想要的是獲得像這樣的數據,如果有人搜索一個產品,他們希望所有產品是藍色的,並有內置的CD播放器,所有的屬性數據都在一個數據透視表中,每個項目都有自己的行,這可能是一個問題,讓我知道這是否足夠清晰 –

+0

1.看看你的數據。 ID 12. Typo?2.這是什麼表? at是另一個表的數據? – philipxy

回答

1

您可以使用group byhaving來做到這一點。你的邏輯是難以遵循,但它是這樣的:

select post_id 
from table t 
where attribute_value_id in (3, 9) 
group by post_id 
having count(distinct attribute_id) = 2; 

我想你會想檢查attribute_id爲好,但似乎並不成爲問題的一部分。

編輯:

如果這些都存儲在另一個表:

select a.post_id 
from attributes a join 
    searching_for_attributes sfa 
    on a.attribute_id = sfa.attribute_id and 
     a.attribute_value_id = sfa.attribute_value_id 
group by a.post_id 
having count(*) = (select count(*) from searching_for_attributes); 
+0

感謝您的深入響應。我從使用GROUP BY和HAVING COUNT方法的第一個響應中獲得靈感。再次感謝。 –

0

針對@GordonLinoff答案,我已經成功地使用GROUP BY和HAVING COUNT以獲得所需的數據。以下是我想出了,希望這可以幫助別人......

select * 
from `searching_for_posts` 
where (
    select count(*) 
    from `attributes` 
    inner join `searching_for_attributes` on `attributes`.`id` = `searching_for_attributes`.`attribute_id` 
    where `searching_for_attributes`.`searching_for_post_id` = `searching_for_posts`.`id` 
    and `attribute_value_id` in (3, 9) 
    having count(distinct `attributes`.`id`) = 2 
) >= 1 
group by `id` 
相關問題