我有一个相当的,对我来说,复杂的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)
这个..
(
(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)
您需要检查您的操作员以确保您获得正确的逻辑
| 归档时间: |
|
| 查看次数: |
271651 次 |
| 最近记录: |