带有多个 where 语句的 sql 查询

我有一个相当,对我来说,复杂的 mysql 查询,我完全卡住了,无法找到任何在线答案。

我的疑问是:

SELECT
items.*
FROM
items
INNER JOIN
items_meta_data
WHERE
(
(meta_key = 'lat' AND meta_value >= '55')
OR
(meta_key = 'lat' AND meta_value <= '65')
)
AND
(
(meta_key = 'long' AND meta_value >= '20')
OR
(meta_key = 'long' AND meta_value <= '30')
)
GROUP BY
item_id

当然,我只用1条语句测试了查询,这样就可以很好地工作了。所以,如果我只通过 long 或 lat 部分,就会得到结果。只有当我试图把它们缝合在一起时,我才会得到不同的结果。

提前谢谢你的帮助!

表格结构如下:

Table items:
ID
item_name
item_description


Table meta:
meta_id
item_id
meta_key
meta_value

解决方案

我终于解决了这个问题,感谢大家的帮助和参与。

SELECT
SQL_CALC_FOUND_ROWS items.*
FROM
items
INNER JOIN
items_meta ON (items.ID = items_meta.post_id)
INNER JOIN
items_meta AS m1 ON (items.ID = m1.post_id)
WHERE
1=1
AND
items.post_type = 'post'
AND
(items.post_status = 'publish')
AND
( (items_meta.meta_key = 'lat' AND CAST(items_meta.meta_value AS SIGNED) BETWEEN '55'   AND '65')
AND
(m1.meta_key = 'long' AND CAST(m1.meta_value AS SIGNED) BETWEEN '20' AND '30') )
GROUP BY
items.ID
ORDER BY
items.date
DESC
456272 次浏览

这个..。

(
(meta_key = 'lat' AND meta_value >= '60.23457047672217')
OR
(meta_key = 'lat' AND meta_value <= '60.23457047672217')
)

(
(meta_key = 'lat')
)

将它们全部加起来(同样适用于 long过滤器) ,您就有了这个不可能的 WHERE 子句,它将不会给出任何行,因为 meta_key不能是一行中的2个值

WHERE
(meta_key = 'lat' AND meta_key = 'long' )

您需要检查您的运营商,以确保您得到正确的逻辑

什么是 meta_key? 去掉所有的 meta_value条件句,reduce,你得到的结果是:

SELECT
*
FROM
meta_data
WHERE
(
(meta_key = 'lat')
)
AND
(
(meta_key = 'long')
)
GROUP BY
item_id

由于 meta_key不能同时等于两个不同的值,因此不会返回任何结果。


根据这个问题的评论和到目前为止的答案,听起来你正在寻找类似这样的东西:

SELECT
*
FROM
meta_data
WHERE
(
(meta_key = 'lat')
AND
(
(meta_value >= '60.23457047672217')
OR
(meta_value <= '60.23457047672217')
)
)
OR
(
(meta_key = 'long')
AND
(
(meta_value >= '24.879140853881836')
OR
(meta_value <= '24.879140853881836')
)
)
GROUP BY
item_id

注意顶级条件句之间的 OR。这是因为你想要的记录是 lat 或者 long,因为没有单一的记录将永远是 lat 还有 long

我还是不明白你想用内在条件句达到什么目的。任何非空值将匹配这些数字。也许你可以详细解释一下你到底想做什么。我也不确定 GROUP BY条款的目的,但这可能完全超出了这个问题的上下文。

我们能看看你桌子的结构吗?如果我理解了这一点,那么查询所做的假设是,一条记录只能是 meta_key - 'lat'或者 meta_key = 'long',而不能两者兼而有之,因为每一行只有一个 meta_key列,并且只能包含1个对应的值,而不是2。这就可以解释为什么当你连接 AND的时候没有结果,这是不可能的。

您需要考虑的是,GROUP BY发生在 WHERE子句条件得到评估之后。而且 WHERE子句始终只考虑一行,这意味着在查询中,meta_key条件将始终阻止选择任何记录,因为 一列不能有一行的多个值

那么多余的 meta _ value 检查呢?如果一个值允许小于或大于给定的值,那么它的实际值根本不重要——检查可以省略。

根据你的一条评论,你想检查的地方少于一定的距离从一个给定的位置。为了得到正确的距离,实际上你必须使用某种适当的距离函数(详见 这个问题)。但是这个 SQL 应该会告诉你如何开始:

SELECT items.* FROM items i, meta_data m1, meta_data m2
WHERE i.item_id = m1.item_id and i.item_id = m2.item_id
AND m1.meta_key = 'lat' AND m1.meta_value >= 55 AND m1.meta_value <= 65
AND m2.meta_key = 'lng' AND m2.meta_value >= 20 AND m2.meta_value <= 30