【问题标题】:How to fix SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)如何修复 SQLSTATE[21000]:基数违规:1241 操作数应包含 1 列
【发布时间】:2020-08-03 16:48:44
【问题描述】:

运行以下代码时出现 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. 由于平台内置db架构,我只能通过where子句使用radius search子查询。
  2. 另一件事是我可能必须根据距离(自定义)或基于 time_created(默认)对搜索结果进行排序

【问题讨论】:

    标签: mysql sql database geolocation


    【解决方案1】:

    问题是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
           )
    

    【讨论】:

    • 戈登,感谢您的修复。那行得通。但是如果我想根据计算的距离对用户进行排序怎么办?
    • @mohammedaqeel 。 . .那将是一个非常不同的问题,应该作为问题提出。您无法通过在where 子句中进行过滤来做到这一点。您需要使用 JOIN 或相关子查询。
    • 戈登,谢谢。正如我在主要问题中所说,由于平台数据库的特定架构,我不能执行 JOIN 子句。以前我曾经使用相同的查询来执行此操作,然后按距离排序。你能帮我处理相关的子查询吗?提前致谢。
    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 2013-11-20
    • 1970-01-01
    • 2013-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多