2014-02-06 33 views
0

我需要查詢兩列「oc_filter_group_description.name」和「oc_filter.name」並獲得所有匹配結果。
別名似乎導致我的問題。我試過使用子查詢,但作爲一個完整的新手,我真的不知道我在做什麼。
以下是代碼。 or子句是什麼需要適應
多個表OR子句和別名

SELECT *,(SELECT name FROM oc_filter_group_description fgd 

WHERE f.filter_group_id = fgd.filter_group_id) AS `group` 

FROM oc_filter f LEFT JOIN oc_filter_description fd ON (f.filter_id = fd.filter_id) 

WHERE fd.name LIKE '% **QUERY GOES HERE** %' 

OR 'group' LIKE '% **QUERY GOES HERE** %' 

我已經花了很多時間試圖得到這個工作,我想我在重新強制執行最好打個電話。
在此先感謝

+0

你得到了什麼錯誤? – Melon

+0

嘗試刪除單引號和組。 – Craftein

回答

3

您不能引用where子句中select中定義的列別名。這是你的查詢:

SELECT *, 
     (SELECT name 
     FROM oc_filter_group_description fgd 
     WHERE f.filter_group_id = fgd.filter_group_id 
     ) AS `group` 
FROM oc_filter f LEFT JOIN 
    oc_filter_description fd 
    ON f.filter_id = fd.filter_id 
WHERE fd.name LIKE '% **QUERY GOES HERE** %' OR 
     'group' LIKE '% **QUERY GOES HERE** %'; 

它有兩個明顯的問題。首先是'group'是一個字符串常量而不是列引用。 只有字符串文字使用單引號。它避免了這種類型的問題。第二個是指select條款中定義的group

最好的解決方法是用另一個join來替換select子查詢:

SELECT *, fgd.name as group_name 
FROM oc_filter f LEFT JOIN 
    oc_filter_description fd 
    ON f.filter_id = fd.filter_id LEFT JOIN 
    oc_filter_group_description fgd 
    ON f.filter_group_id = fgd.filter_group_id 
WHERE fd.name LIKE '% **QUERY GOES HERE** %' OR 
     fgd.name LIKE '% **QUERY GOES HERE** %'; 

請注意,我也改變了名稱groupgroup_name,所以它不會與一個MySQL衝突保留字。瞧,不需要引號。

+0

非常感謝。 – TarranJones

0

這可能看起來微小的事情,但你不應該使用反引號,並儘可能避免關鍵字:

SELECT *, (
    SELECT name FROM oc_filter_group_description fgd 
    WHERE f.filter_group_id = fgd.filter_group_id) AS T_GROUP 
FROM oc_filter f LEFT JOIN oc_filter_description fd ON (f.filter_id = fd.filter_id) 
WHERE fd.name LIKE '% **QUERY GOES HERE** %' 
OR T_GROUP LIKE '% **QUERY GOES HERE** %' 

希望這有助於。

0

你讓它變得複雜得多。所有你需要的是這樣的:

select just the fields you need 
from oc_filter f LEFT JOIN oc_filter_description fd ON (f.filter_id = fd.filter_id) 
and (fd.name like '%static text goes here, not a query%' 
or `group` like '%static text goes here, not a query%') 

請注意,過濾器現在是連接的一部分,而不是一個where子句。如果它們在where子句中,則左連接將實際上成爲內連接。