Mysql PHP查询中的组合Where子句

Mysql PHP查询中的组合Where子句,php,mysql,sql,Php,Mysql,Sql,我有两个名为Classifieds的表,下面是Classifieds\u 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_v

我有两个名为
Classifieds
的表,下面是Classifieds\u 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语句忽略了
vehicle\u make
meta\u value
meta\u key
字段条件,并显示了不正确的结果,我想要实现的正是我想要得到类别在(2,3,4或5)中的车辆meta_键是车辆品牌,meta_值是3或4,meta_键是车辆里程,meta_值是9、10或11


有人能帮我生成更好的SQL语句以获得正确的结果吗?

这基本上就是您所拥有的(不包括表连接和类别筛选器):

因此,
车辆制造
部分是不可能的,因为meta_值从来都不是(3或4)和9

我想你的目的是:

(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))
)

从这一点可以看出运算符优先级。和对在或之前进行评估。

这基本上就是您拥有的(不包括表连接和类别过滤器):

因此,
车辆制造
部分是不可能的,因为meta_值从来都不是(3或4)和9

我想你的目的是:

(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))
)

从这一点可以看出运算符优先级。和对在或之前进行评估。

这基本上就是您拥有的(不包括表连接和类别过滤器):

因此,
车辆制造
部分是不可能的,因为meta_值从来都不是(3或4)和9

我想你的目的是:

(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))
)

从这一点可以看出运算符优先级。和对在或之前进行评估。

这基本上就是您拥有的(不包括表连接和类别过滤器):

因此,
车辆制造
部分是不可能的,因为meta_值从来都不是(3或4)和9

我想你的目的是:

(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))
)

从这一点可以看出运算符优先级。而且配对在或之前得到评估。

我认为您正在寻找一个
具有
子句的
而不是
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,使其使用显式
join
语法。

我认为您正在寻找一个
具有
子句而不是
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,使其使用显式
join
语法。

我认为您正在寻找一个
具有
子句而不是
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,使其使用显式
join
语法。

我认为您正在寻找一个
具有
子句而不是
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
语法的连接。

我假设您正在查找类别为2、3、4或5且(meta_键为车辆品牌且(meta_值为3或4))或(meta_键为车辆里程且(meta_值为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查询中使用相同的括号

编辑:

如果要在查询中使用,请执行以下操作:

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)))

我假设您正在寻找类别为2、3、4或5且(meta_键为车辆品牌且(meta_值为3或4))或(meta_键为车辆里程且(meta_值为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查询中使用相同的括号

编辑:

如果要在查询中使用,请执行以下操作:

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)))

我假设您正在寻找类别为2、3、4或5且(meta_键为车辆品牌且(meta_值为3或4))或(meta_键为车辆里程且(meta_值为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查询中使用相同的括号

编辑:

如果要在查询中使用,请执行以下操作:

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)))

我假设您正在寻找类别为2、3、4或5且(meta_键为车辆品牌且(meta_值为3或4))或(meta_键为车辆里程且(meta_值为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查询中使用相同的括号

编辑:

如果要在查询中使用,请执行以下操作:

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)))

屏幕转储不允许轻松设置测试用例。您能否将一些示例数据和所需结果作为文本直接添加到您的问题中?可能的重复数据库设计与
meta\u key/value
vs
propertyname/value
类似<代码>元钥匙
不能同时显示
车辆品牌
车辆里程
。屏幕转储不允许轻松设置测试用例。您能否将一些示例数据和所需结果作为文本直接添加到您的问题中?可能的重复数据库设计与
meta\u key/value
vs
propertyname/value
类似<代码>元钥匙
不能同时显示
车辆品牌
车辆里程
。屏幕转储不允许轻松设置测试用例。你能添加一些样本数据和期望的结果吗