带有多个where语句的sql查询

use*_*774 44 mysql

我有一个相当的,对我来说,复杂的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
Run Code Online (Sandbox Code Playgroud)

当然,我只用1个语句测试了查询,并且工作正常.因此,如果我只传递长或纬度部分,那么我得到结果.只有当我尝试将它们拼接在一起时才会得到不同的结果.

我在这里先向您的帮助表示感谢!

表结构如下:

表项:ID item_name item_description

表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
Run Code Online (Sandbox Code Playgroud)

cod*_*ing 31

您需要考虑在评估子句条件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
Run Code Online (Sandbox Code Playgroud)


gbn*_*gbn 6

这个..

(
        (meta_key = 'lat' AND meta_value >= '60.23457047672217')
    OR
        (meta_key = 'lat' AND meta_value <= '60.23457047672217')
)
Run Code Online (Sandbox Code Playgroud)

是相同的

(
        (meta_key = 'lat')
)
Run Code Online (Sandbox Code Playgroud)

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

WHERE
    (meta_key = 'lat' AND meta_key = 'long' )
Run Code Online (Sandbox Code Playgroud)

您需要检查您的操作员以确保您获得正确的逻辑