mysql - SQL 查询根据第二个查询的结果标记行

标签 mysql sql

我有一个包含数字范围的 MySQL 数据库。它具有以下结构:

range_id, 开始, 结束

所有列都是 INT(10)。此外,还有一个名为 range_poly 的多边形字段用于索引。

我想标记所有“外部”范围:不包含在数据库中另一个范围内的所有范围。例如:

range_id  |  start |  end
    1     |    1   | 2
    2     |    4   | 5
    3     |    1   | 10

在这种情况下,第三条记录是“外部范围”,因为它不包含在另一个范围内,但第一条和第二条记录不是,因为它们完全包含在记录 3 内。为了实现这一点,我添加了一列称为 is_outer,它是一个简单的 INT(1),用于指示该范围是否包含在另一个范围内。我正在使用以下 php 脚本:

$result = mysql_query(mysql_real_escape_string("SELECT range_id, start FROM table;"), $db);

while($row = mysql_fetch_array($result))
{
    $result2 = mysql_query(mysql_real_escape_string("SELECT range_id FROM table WHERE MBRCONTAINS( range_poly, POINTFROMWKB( POINT( ". $row['start'] ." , 0 ) ) ) ORDER BY (`end` - `start`) DESC LIMIT 1;"), $db); 
    $row2 = mysql_fetch_array($result2);
    mysql_query(mysql_real_escape_string("UPDATE table SET is_outer = 1 WHERE range_id = ". $row2['range_id'] . ";"), $db);
}

这很好用,但我不禁觉得应该有一种更简单的方法来实现这一点。我似乎无法全神贯注地想办法做到这一点是纯基于 SET 的查询。或者我可以使用 CURSOR 对此进行编码,但我想知道与 PHP 版本相比性能是否会好得多。我的数据库有大约 370 万条记录,这解释了为什么性能非常重要。

我已尝试使用子查询,但子查询中不允许使用 LIMIT。或者,我正在考虑自己加入表格,但我无法确定合适的条件。

最佳答案

如果我对你的问题的理解正确,你想返回所有的 parent (外部范围)。

如果是这样,尝试这样的事情:

SELECT 
  t1.range_id
FROM YourTable t1
   LEFT JOIN YourTable t2 ON 
    t1.start >= t2.start AND t1.end <= t2.end AND t1.range_id <> t2.range_id
WHERE t2.range_id IS NULL

这里是 SQL Fiddle .

如果您有重复的数据 (7, 33,36) 和 (8, 33,36),并且您希望两者都返回,您可以将此添加到您的 WHERE 子句中:

OR (t1.start = t2.start AND t1.end = t2.end)

祝你好运。

关于mysql - SQL 查询根据第二个查询的结果标记行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14675173/

相关文章:

mysql load xml语句产生0条记录

mysql - 验证另一个表中数据的唯一性

mysql - 如何保存一个国家属于哪个组?

MySQL 查询具有按同一列分组的多个计数条件

sql - 如何从 SQL 中的日期时间列中减去时间列?

mysql - 如何通过 Bookshelf.js 更好地使用 SQL 别名

javascript - Sequelize .set 错误,.set 不是函数

php - 认为我需要自助加入?

mysql - SQL 存储例程

sql - 字符串或二进制数据将被截断。该语句已终止。简单错误