2011-11-16 37 views
0

我想得到的結果,我知道在那裏,但似乎無法得到正確的查詢。我現在用的是以下幾點:只是似乎無法得到MySQL查詢正確

SELECT 
    * 
FROM 
    carpets AS c 
    INNER JOIN carpet_relations AS r ON c.id = r.carpet_id 
WHERE 
    c.active = '1' 
    AND **((r.relation_type = '5') 
    AND (r.related_id = '1'))** 
    *AND* ((r.relation_type = '4') 
    AND (r.related_id = '1')) 
    AND (c.width_feet BETWEEN '0' AND '17') 
    AND (c.width_inches BETWEEN '0' AND '11') 
    AND (c.height_feet BETWEEN '0' AND '29') 
    AND (c.height_inches BETWEEN '0' AND '11') 
ORDER BY 
    c.item_no 

,你能看到我的努力是在第二表中的兩個匹配字段,如果我改變的,那就是在斜體的或我得到查詢結果的結果,但它是結果兩個我需要是在之前的設定和大膽的結果

所以它會是這樣的:有關係類型5和4

列表牢記相關身份證可能會有所不同,因爲有三個colu MS carpet_id,related_id,relation_type

感謝您的幫助

c_categories 列類型Null默認註釋 ID INT(11)否
標題爲varchar(250)無
活躍INT(11)否
重量INT(11)否
template_id INT(11)否

c_sizes 列類型Null默認註釋 ID INT(11)N ø
標題VARCHAR(250)否
有源INT(11)否
重量INT(11)否
template_id INT(11)否

carpet_relations

列類型Null默認註釋

carpet_id int(11)否< ------表示與哪個地毯的關係爲

related_id int(11)否< ------的c_size或c_categories的id使用

relation_type INT(11)否< ------表示哪個表要麼c_sizes或c_categories

+0

你的意思是5型或4? – Chris

+0

只是爲了確保它被理解爲5將聲明關係是針對一個類別的,並且與它的關係是1表示它是類別1,然後4將聲明關係是針對模板和針對它的1說它是模板1 ..........我沒有寫或設計數據庫,但我必須處理它 –

+0

它縮小搜索範圍,因此它需要是他們選擇類別1主要,然後縮小與類別2,如果我這樣做,或者它會帶來更多的結果,而不是像它應該更少的結果 –

回答

0

現在我想我明白你的問題 - 你5類型和類型的結果4.

這可能在PHP做你的路口後是通過做兩個查詢和交叉他們提了,或者您也可以通過加入對carpet_relations表做到這一點在MySQL兩次像這樣:

SELECT 
    * 
FROM 
    carpets AS c 
    INNER JOIN carpet_relations AS r1 ON c.id = r1.carpet_id 
    INNER JOIN carpet_relations AS r2 ON c.id = r2.carpet_id 
WHERE 
    c.active = '1' 
    AND (r1.relation_type = '5') 
    AND (r1.related_id = '1') 
    AND (r2.relation_type = '4') 
    AND (r2.related_id = '1') 
    AND (c.width_feet BETWEEN '0' AND '17') 
    AND (c.width_inches BETWEEN '0' AND '11') 
    AND (c.height_feet BETWEEN '0' AND '29') 
    AND (c.height_inches BETWEEN '0' AND '11') 
ORDER BY 
    c.item_no 
+0

完美的伎倆.....謝謝sooooo現在我只需要看看它,瞭解你在做什麼,因爲聯接並查詢這個複雜的是新的我我通常做更簡單的沒有聯接,但這個工程太棒了! –

+0

很高興它適合你。基本上你必須兩次加入carpet_relations表,一次得到relation_type爲5的地毯,另一次是relation_type爲4的地毯。如果你想添加另一個約束,比如relation_type是7,你必須加入再次在地毯參考表上。祝你好運。 – Chris

+0

哦,請點擊接受,如果你認爲這是正確的答案;) – Chris

2

更改此:

((r.relation_type = '5') AND (r.related_id = '1')) AND ((r.relation_type = '4') AND (r.related_id = '1'))

這樣:

(r.relation_type = '5' OR r.relation_type = '4') AND (r.related_id = '1')

+0

它需要(5和1)和(4和1) –

+0

正如@UgurGumushan所指出的那樣,'r.relation_type'不能同時是4 *和* 5。 – kol

0
AND ((r.relation_type = '5') 
AND ((r.relation_type = '4') 

您希望關係類型同時爲5和4。

你想在你的沙拉有一些「或」?

編輯:

SELECT 
    * 
FROM 
    carpets AS c 
    INNER JOIN carpet_relations AS r ON c.id = r.carpet_id 
WHERE 
    c.active = '1' 
    AND 
((r.relation_type = '5') AND (r.related_id = '1')) 
    OR 
((r.relation_type = '4') AND (r.related_id = '1')) 

    AND (c.width_feet BETWEEN '0' AND '17') 
    AND (c.width_inches BETWEEN '0' AND '11') 
    AND (c.height_feet BETWEEN '0' AND '29') 
    AND (c.height_inches BETWEEN '0' AND '11') 
ORDER BY 
    c.item_no 

解決您的問題。

+0

與表5代表與關係id的類別關係等於類別id,然後4代表模板關係與關係id是模板ID,這就是爲什麼我需要兩個 –

+0

我試過,然後它帶來了168件事所以它應該是,當用戶搜索說長地毯,這是整體類別,然後他們點擊,他們想要縮小到東方地毯我不想要一個完整列表的長地毯和東方只是東方地毯,也是一個長地毯 –

1

對於靈活性的緣故:

r.relation_type IN (4, 5) 
+0

+1 Nice'n'brief(TM) – kol