2014-09-04 49 views
0

我在使用我的sql語句時遇到了一些麻煩。複雜SQL查詢條件中的語法錯誤

下面是相關的表的一個圖:

enter image description here

的產品可以在多個類別。 單品可以有多個varietycategories(即:尺寸,顏色,等等) 一個varietycategory可以有多個varietycategoryoptions(即:小,中,大)

表searchcriteria.criterianame鬆耦合涉及varietycategory.category

表searchcriteriaoption.criteriaoption鬆散地關聯到varietycategoryoption.descriptor。

我得到了searchcriteria.criterianame,並使用該字符串作爲我們想要與varietycategory.category匹配的值,我們還必須獲得各種searchcriteriaoption.criteria選項字符串(針對該searchcriteria.criterianame)並將其與針對varietycategory選項進行匹配。描述符爲那個varietycategory.category。

這裏是SQL:

SELECT DISTINCT categories.*, product.* 
FROM (categories, product, product_category) 
LEFT JOIN varietycategory ON varietycategory.productid = product.id 
LEFT JOIN varietycategoryoption ON varietycategoryoption.varietycategoryid = varietycategory.id 
WHERE product_category.categoryid=4 
AND product.id=product_category.productid 
AND categories.category_id=product_category.categoryid 
AND (
     (varietycategory.category = 'color' AND (varietycategoryoption.descriptor='red' OR varietycategoryoption.descriptor='blue')) 
     OR 
     (varietycategory.category = 'size' AND (varietycategoryoption.descriptor = 'small' OR varietycategoryoption.descriptor='medium')) 
    ) 

,但我得到一個錯誤:

Unknown column 'varietycategory.id' in 'on clause'

我試圖找出我做錯了。我嘗試簡化查詢(僅嘗試確定sql查詢的哪個部分導致問題),只將searchcriteria.category字符串與varietycategory.category匹配,並且查詢返回正確的數據集。 這裏是工作的查詢(此查詢簡化和不足)

SELECT DISTINCT categories.*, product.* 

FROM (categories, product, product_category) 
LEFT JOIN varietycategory ON varietycategory.productid = product.id 
WHERE product_category.categoryid=4 
AND product.id=product_category.productid 
AND categories.category_id=product_category.categoryid 
AND (varietycategory.category = 'color' OR varietycategory.category = 'size' OR varietycategory.category='shape'); 

但我也需要能夠匹配對varietycategoryoptions爲好。

只是爲了避免混淆,我只使用searchcriteria獲取字段類別並將其用作字符串來匹配varietycategory.category ,我只使用searchcriteriaoption獲取字段criteriaoption並將其用作字符串以匹配與varietycategoryoption.descriptor

有誰知道我在做什麼錯我的第一個查詢? 請幫忙,因爲SQL不是專業知識。

謝謝!

回答

2

的錯誤是:

OR 
    (varietycategory.category = 'size' (varietycategoryoption.desciptor = 'small' OR varietycategoryoption.descriptor='medium')) 
            ^
            | 
An operator (AND, OR) is missing here 

這有什麼好做的聯接語法,順便說一句。

+0

謝謝你的回覆。感謝您的建議,我添加了AND運算符。 sql錯誤現在已經改變,我相信它現在確實與連接語法有關。 – 2014-09-04 03:38:42

1

不要混合隱式和顯式連接。您的查詢應該是這樣的:

SELECT DISTINCT c.*, p.* 
FROM product_category pc join 
    categories c 
    on c.category_id = pc.categoryid join 
    product p 
    on p.id = pc.productid join 
    varietycategory vc 
    ON vc.productid = p.id 
WHERE c.categoryid = 4 AND 
     vc.category in ('color', 'size', 'shape'); 

你可能不需要distinct,而是依賴於數據。 left join是不必要的,因爲您正在篩選where中的第二個表。

一個簡單的規則:從不在from子句中使用逗號。爲了幫助,MySQL有確定範圍的規則,當你混合隱式和顯式連接語法時,這些規則可能會導致查詢中斷。

+0

哦,你迴應了實際上不給我錯誤的查詢。第一個查詢是沒有正確返回的。順便說一句,如果我沒有添加不同的它是返回多個相同的產品,因爲該產品有多個種類(顏色,大小等)。 – 2014-09-04 03:43:06

0

問題是桌子上品種類別拼錯的字段,我命名爲 vcid,當我幾乎總是命名我的表主鍵ID的「ID」。