首页 > 解决方案 > 如何修复 SQLSTATE[21000]:基数违规:1241 操作数应包含 1 列

问题描述

运行以下代码时出现 sql 错误。我是 SQL 的新手。因此,如果这是一个愚蠢的问题,请忽略。以下是我的 SQL 查询,用于根据用户的位置返回一些用户

SELECT DISTINCT e.* FROM users u WHERE (u.id IN (SELECT id, 
                                            (6371 * acos( 
                                                        cos( radians(9.9894229) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(76.57897489999999) ) + sin( radians(9.9894229) ) * sin( radians( latitude ) ) 
                                                    ) 
                                            ) 
                                            AS distance 
                                            FROM users_geo_data 
                                            HAVING distance < 20
                                        )) ORDER BY u.time_created desc, u.id desc LIMIT 10 

但我收到错误消息

SQLSTATE [21000]:基数违规:1241 操作数应包含 1 列

PS:

  1. 由于平台的内置数据库架构,我只能通过 where 子句使用半径搜索子查询。
  2. 另一件事是我可能必须根据距离(自定义)或基于 time_created(默认)对搜索结果进行排序

标签: mysqlsqldatabasegeolocation

解决方案


问题是IN子查询返回多于一列。因此,将距离计算移至where子句:

u.id IN (SELECT id
         FROM users_geo_data 
         WHERE (6371 * acos( 
                            cos( radians(9.9894229) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(76.57897489999999) ) + sin( radians(9.9894229) ) * sin( radians( latitude ) ) < 20
       )

推荐阅读