簡體   English   中英

Mysql PHP查詢中的組合where子句

[英]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_makemeta_valuemeta_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM