[英]Combined Where Clause in Mysql PHP Query
我有2個名為Classifieds
表和Classifieds_meta
表的表,下面是分類表的屏幕截圖
我寫了一個搜索過濾器功能與muliple where子句喜歡
SELECT *,classifieds.id as id
FROM classifieds,classifieds_meta
WHERE (category=2 OR category=3 OR category=4 OR category=5)
AND ((meta_key='vehicle_make' and meta_value=3 OR meta_key='vehicle_make' and meta_value=4)
AND meta_key='vehicle_mileage' and meta_value=9 OR meta_key='vehicle_mileage' and meta_value=10 OR meta_key='vehicle_mileage' and meta_value=11 )
AND classifieds.id=classifieds_meta.classifieds_id
GROUP BY classifieds.id
但是上面的sql語句IGNORES vehicle_make
, meta_value
和meta_key
字段條件並顯示了不正確的結果,我要實現的確切目標是我要獲得類別為(2,3,4或5)且meta_key為vehicle_make和meta_value的車輛是3或4,meta_key是vehicle_mileage,meta_value是9,10或11。
有人可以幫我形成更好的SQL語句以獲得正確的結果嗎
我想您正在尋找類別為2,3,4或5且(meta_key為vehicle_make且(meta_value為3或4))或(meta_key為vehicle_mileage且(meta_value為9,10或11))的車輛。
在這種情況下,查詢應為:
SELECT *,classifieds.id as id
FROM classifieds,classifieds_meta
WHERE (category=2 OR category=3 OR category=4 OR category=5)
AND ((meta_key='vehicle_make' AND ( meta_value=2 OR meta_value=4)) OR (meta_key='vehicle_mileage' AND (meta_value=9 OR meta_value=10 OR meta_value=11)))
使用括號使語句易於理解,最后在SQL查詢中使用相同的括號。
編輯:
如果要使用IN,查詢將是:
SELECT *,classifieds.id as id
FROM classifieds,classifieds_meta
WHERE category IN (2, 3, 4, 5)
AND ((meta_key='vehicle_make' AND meta_value IN (2,4)) OR (meta_key='vehicle_mileage' AND meta_value IN (9, 10, 11)))
我認為您正在尋找的是having
子句,而不是where
。 您正在嘗試跨多個行查找條件:
SELECT *, c.id as id
FROM classifieds c join
classifieds_meta cm
on c.id = cm.classifieds_id
GROUP BY c.id
HAVING sum(meta_key = 'vehicle_make' and meta_value in (3, 4)) > 0 and
sum(meta_key = 'vehicle_mileage' and meta_value in (9, 10, 11)) > 0 and
sum(category in (2, 3, 4, 5)) > 0
> 0
表示每個條件至少匹配一行。
請注意,我也將聯接固定為使用顯式join
語法。
這基本上就是您所擁有的(不包括表連接和類別過濾器):
((meta_key='vehicle_make' and meta_value IN (3,4)) AND meta_key='vehicle_mileage' and meta_value=9)
OR
(meta_key='vehicle_mileage' and meta_value IN (10, 11))
因此,由於meta_value決不能同時為(3 OR 4)和9,因此無法完成vehicle_make
部分。
我認為您想要的是:
(meta_key='vehicle_make' and meta_value IN (3,4))
OR
(meta_key='vehicle_mileage' and meta_value IN (9, 10, 11))
現在都在一起了:
WHERE classifieds.id=classifieds_meta.classifieds_id AND category IN (2, 3, 4, 5)
AND (
(meta_key='vehicle_make' and meta_value IN (3,4))
OR
(meta_key='vehicle_mileage' and meta_value IN (9, 10, 11))
)
得出的結論是運算符優先級。 AND對在OR之前被求值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.