【问题标题】:mysql - SELECT UNTIL in sqlmysql - 在 sql 中选择 UNTIL
【发布时间】:2012-10-22 20:39:35
【问题描述】:

我想选择行,直到找到某个值并且它不是数字,所以我不能使用 > 或

例子:

-----
Value
-----
45
434
348
213
543
3445
343
123
34345

我想选择 543 之前的所有记录(NOT ORDERED by anything)

提前致谢

【问题讨论】:

  • 请举一个示例数据的示例以及您希望在其上实现的目标。
  • 表不是数组,它没有固有的顺序。那么您要按哪些列排序?
  • 你不能选择543之前的记录没有被任何东西排序。正如@TimSchmelter 所说,桌子上没有固有的顺序
  • 并非不可能,而是不合逻辑。 (假设我们正确理解了这个问题)
  • 如果你想要 before暗示一个订单)和 notorder by (要求 不是命令),你看到可以做到的两组方式的交集是空的。您需要使用 SQL 以外的语言执行此操作(这样做,您暗示一个顺序——提取顺序)。

标签: php mysql sql-server database


【解决方案1】:

解决了“没有顺序”的问题,也就是说,您将不得不选择某种顺序(例如主键的顺序,或者记录分配 OID 的顺序),您的问题变成:

"I want all the records whose ordering field is less than the value
 of the row for which ordering field is minimum, and VALUE is 543".

因此您选择值为 543 的最小行

SELECT MIN(id) AS id FROM yourtable WHERE value = 543

或者,出于其他目的,可能类似于

SELECT MIN(id) AS id FROM yourtable WHERE value >= 543

然后选择该记录之前的所有记录:

SELECT value FROM yourtable WHERE id < ( SELECT MIN(id) AS id FROM yourtable WHERE value = 543 );

所以你的桌子可能是:

ID    Value
-----------
1     45
2     434
3     348
4     213
5     543
6     3445
7     343
8     123
9     34345

你会得到:

45
434
348
213
543

您没有看到订单,但必须有一个。这是id上的订单。

根据您的要求,value 可以是任何内容 - 文本,甚至是图像 BLOB - 并且“排序”保持隐藏状态。

在其他语言中,您会执行以下操作:

qry = SQL.exec('SELECT * FROM yourtable;');
while ((value = qry.next().value) != '543':
    write value '\n'
qry.close()

但是要么SELECT的顺序不会被指定,你可能每次都会得到不同的结果,或者是表中元组插入的顺序。这与显式使用id 相同。

【讨论】:

  • @Fady 如果 543 在您的值中出现多次,您希望发生什么?
【解决方案2】:

这个答案可能会迟到,但因为它是谷歌上的第一个结果,术语为“mysql select until”,希望这可能对某人有所帮助。

您可以做的是声明一个标记,如果您找到所需的值,请将标记设置为NULL 以外的任何值。然后我们可以使用ISNULL 来检查我们是否已经到达该行。

SET @marker = NULL;
SELECT value FROM table1 WHERE ISNULL(@marker:=IF(value=543,value,@marker));

Here is a demo

【讨论】:

  • 虽然这可能会返回所需的结果,但我怀疑它会执行全表或索引扫描:优化器很可能没有意识到条件一旦为假就永远不会再次变为真,因此继续加载剩余的每一行并评估条件,只有再次排除该行。对于大型数据集,这会浪费很多精力。 (如果有我不知道的优化,请告诉我。)
【解决方案3】:

您可以在查询中使用相等比较器,直接搜索您要查找的值。

当您可以指定要搜索的内容时,为什么还要遍历数据库直到找到它?

您没有举例说明您要搜索的值是什么,所以如果它是一个字符串

Select x.* from table x WHERE x.Column = 'String Value'

但是,如果您确实想在数据库上增加一些额外的负载(在这种未定义的情况下),您将有一个存储过程,循环访问存储在数据库中的 ID。

为此,请查看以下帖子,它可能会给您一些启发:SQL LOOP INSERT Based on List of ID's

【讨论】:

  • 这并没有真正回答所问的问题。
猜你喜欢
  • 2013-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 2010-12-26
  • 2010-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多