如何修复 SQLSTATE[21000]:基数违规:1241 操作数应包含 1 列
Posted
技术标签:
【中文标题】如何修复 SQLSTATE[21000]:基数违规:1241 操作数应包含 1 列【英文标题】:How to fix SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s) 【发布时间】: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:
-
由于平台内置db架构,我只能通过where子句使用radius search子查询。
另一件事是我可能必须根据距离(自定义)或基于 time_created(默认)对搜索结果进行排序
【问题讨论】:
【参考方案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 子句。以前我曾经使用相同的查询来执行此操作,然后按距离排序。你能帮我处理相关的子查询吗?提前致谢。以上是关于如何修复 SQLSTATE[21000]:基数违规:1241 操作数应包含 1 列的主要内容,如果未能解决你的问题,请参考以下文章
选择子句上的 CASE 子句抛出 'SQLCODE=-811, SQLSTATE=21000' 错误
SQLSTATE [23000]:完整性约束违规:1062 键“users_melli_unique”的重复条目“0430142821”
SQLSTATE [23502]:非空违规:7 错误 - laravel