SQLite查找列子集满足指定约束的表行
我有下面的SQLite表SQLite查找列子集满足指定约束的表行,sqlite,constraints,Sqlite,Constraints,我有下面的SQLite表 CREATE TABLE visits(urid INTEGER PRIMARY KEY AUTOINCREMENT, hash TEXT,dX INTEGER,dY INTEGER,dZ INTEGER); 典型的内容是 # select * from visits; urid | hash | dx | dY | dZ ------+-----------+-------+--------+
CREATE TABLE visits(urid INTEGER PRIMARY KEY AUTOINCREMENT,
hash TEXT,dX INTEGER,dY INTEGER,dZ INTEGER);
典型的内容是
# select * from visits;
urid | hash | dx | dY | dZ
------+-----------+-------+--------+------
1 | 'abcd' | 10 | 10 | 10
2 | 'abcd' | 11 | 11 | 11
3 | 'bcde' | 7 | 7 | 7
4 | 'abcd' | 13 | 13 | 13
5 | 'defg' | 20 | 21 | 17
这里我需要做的是为满足约束的表行识别urid
hash = 'abcd' AND (nearby >= (abs(dX - tX) + abs(dY - tY) + abs(dZ - tZ))
最小偏差-指绝对距离的最小和
在目前的情况下
nearby = 7
tX = tY = tZ = 12
有三行满足上述约束,但有不同的偏差
urid | hash | dx | dY | dZ | deviation
------+-----------+-------+--------+--------+---------------
1 | 'abcd' | 10 | 10 | 10 | 6
2 | 'abcd' | 11 | 11 | 11 | 3
4 | 'abcd' | 12 | 12 | 12 | 3
在这种情况下,我想报告urid=2
或urid=3
——我实际上不在乎报告哪一个
在我自己的设备上,我将获取完整的匹配行集,然后在我自己的Java代码中,逐步找到与我的第二个约束(最小偏差)匹配的行。然而,我怀疑这不是必需的,它可以单独在SQL中完成。遗憾的是,我对SQL的了解在这里太有限了。我希望这里有人能让我走上正确的道路
我现在已经做到了以下几点
CREATE TEMP TABLE h1(v1 INTEGER,v2 INTEGER);
SELECT urid,(SELECT (abs(dX - 12) + abs(dY - 12) + abs(dZ - 12))) devi FROM visits WHERE hash = 'abcd';
给
--SELECT * FROM h1
urid | devi |
-------+-----------+
1 | 6 |
2 | 3 |
4 | 3 |
随后我发布
select urid from h1 order by v2 asc limit 1;
这就产生了urid=2,我所追求的结果。虽然这是可行的,但我想知道是否有更好/更简单的方法来实现这一点。你太接近了!您拥有所需的所有组件,只需将它们组合到一个查询中即可 考虑:
SELECT urid
, (abs(dx - :tx) + abs(dy - :tx) + abs(dz - :tx)) AS devi
FROM visits
WHERE hash=:hashval AND devi < :nearby
ORDER BY devi
LIMIT 1
选择urid
,(abs(dx-:tx)+abs(dy-:tx)+abs(dz-:tx))作为装置
来自访问
其中hash=:hashval和devi<:附近
德维命令
限制1
逐行列出visit表中需要的行和计算值(:tx
是占位符;在代码中,您需要准备语句,然后在执行语句之前将值绑定到占位符)
然后在WHERE
子句中,您将返回的行限制为与特定散列
匹配的行(该列应具有最佳结果的索引…CREATE index visions\u idx\u hash ON visions(hash)
),并且具有小于:附近占位符值的devi
。(我认为devi<:nearear
比:nearear>=devi
更清晰)
然后您说您希望这些结果按照
devi
的递增顺序排序,并且将返回的结果限制为一行,因为您不关心任何其他行(如果没有符合WHERE约束的行,则不会返回任何内容)。谢谢。你提供一个答案,然后再做一个完整的解释+1.