SQL:如何从大型连续矩阵中选择矩形范围内的元素**更新**

SQL:如何从大型连续矩阵中选择矩形范围内的元素**更新**,sql,mysql,Sql,Mysql,我很难有效地解决以下问题 我有一个15000x15000xy矩阵。通过定义元素的x,y坐标,我将元素位置存储在这个矩阵中。我想在所谓的视口中显示矩阵的一部分。视口尺寸如1600x1000 考虑以下数据库结构: 元素(元素id、图像、宽度、高度) Globe\u元素(ge\u id,x,y,Element\u id) 只有输入是网格(500x500)中的某个x、y坐标,如何选择视口(6x4)中可见的所有全局元素行? 上图展示了这些问题。小橙色方块是应该包含的元素,小红色方块不应该(看最近的视口)

我很难有效地解决以下问题

我有一个
15000x15000
xy矩阵。通过定义元素的x,y坐标,我将元素位置存储在这个矩阵中。我想在所谓的视口中显示矩阵的一部分。视口尺寸如
1600x1000

考虑以下数据库结构:

元素(元素id、图像、宽度、高度)

Globe\u元素(ge\u id,x,y,Element\u id)

只有
输入
是网格(500x500)中的某个x、y坐标,如何选择视口(6x4)中可见的所有
全局元素
行?


上图展示了这些问题。小橙色方块是应该包含的元素,小红色方块不应该(看最近的视口)。大的彩色块(蓝色、黄色、绿色和红色(再次是,很抱歉混淆)是视口。一种颜色就是一个视口。灰色圆圈定义输入坐标。

假设坐标参数是视口的左上角,通常是这样选择对应行的:

从元素g、元素e中选择*

在哪里

e、 元素id=g。元素id和

((x<宽度,x在@x_参数和(@x_参数+6)之间)) 或者(x>-1和x介于(@x_参数-width)和(@x_参数-width+6))之间)

((y_-loc<高度,y_-loc介于@y_-param和(@y_-param+4))之间)或(y_-loc>-1,y_-loc介于(@y_-param-height)和(@y_-param-height+4))之间)

这只是一般的sql,而不是特定于mysql的(至少是参数)

通常:选择其中x在x参数和x参数+视图端口宽度之间,y在y参数和y+参数+视图端口高度之间。如果计算的坐标大于视图端口宽度/高度,则减去500以获得相应的包裹位置

这不会以任何方式排列坐标

还有,你的“球形”环境看起来根本不是球形的……你是如何将网格映射到球体的?就像地球上的纬度/长度一样,当你到达极点时,每个正方形单位的面积都会缩小?如果是这样,那么这就行了。如果不是这样,那么我发布的内容就是垃圾。然而,如果是这样,那么在SQL中解决这个问题就很困难了还有……错。

为了在SQL中有效地实现这一点,我建议您选择支持空间的DBMS(通常称为支持),或者支持二维或多维索引的DBMS(我不知道这类数据库)

我认为只有这样,您才能使查询使用索引来高效地执行

Postgres具有空间支持(名称下),MS SQL 2008和Oracle也是如此。我仅将MS SQL 2008用于空间

如果没有多维索引,磁盘上的对象将沿着一个坐标轴排序,因此只能缩小表格扫描范围,以便只沿着一个坐标轴扫描对象


如果您想继续使用MySQL(回复下面的评论):

我认为最好用具体的值创建查询——无论是在PHP中还是在SQL端的存储过程中,这是一个不同的问题。但在PHP中创建查询非常简单,所以我建议这样做


您可以做出如下决定:视口是否处于非环绕位置(上图中为蓝色),然后通过简单的
发出一个查询,其中xmin>=viewport\u xmin和xmax=viewport\u ymin和ymax(区域缩小,您是对的)。但是,它不能正常工作,因为它没有考虑“globe”维度。如果X参数为498,那么如何选择X介于0和3之间的globe_元素?很好,为了寻找解决方案…有没有办法在mysql中使用1坐标作为输入参数来查询(4)?或者在php中计算内容并用where语句加载sql查询可能更有效?@ropstah:回答这个问题,我的答案中添加了where语句。回答得很好,谢谢。我一直在试验模运算符。你能看到该运算符在这种情况下的正确用法吗?不客气。在数学理论中,你可能最终会得到这是一个很好的使用模运算符的表达式,但我非常确定,目前这个星球上没有任何SQL优化器能够优化该查询以使用索引或任何其他加速。