【问题标题】:about mysql excute order by 1 and rand(1)?关于 mysql 按 1 和 raid(1) 执行命令?
【发布时间】:2016-12-22 08:12:02
【问题描述】:

我在mysql中建了一个表,id是int类型,name和password是varchar类型。 执行

select * from test.new_table order by rand(1);

那么结果是:

这是因为在为 rand 设置种子之后序列是固定的,我已经知道了。但是如果执行

select * from test.new_table order by 1 and rand(1);

那么结果是:

对于这样的结果我不明白。另外,如果按 'xxx' 执行命令,则排列结果。 不太明白,希望大家指点。

【问题讨论】:

  • 您是否在同一个会话中执行这两个查询?如果是这样,您应该不会看到结果集的顺序发生变化。
  • 他们完全在同一个会话中。但是结果改变了。你可以在mysql中测试它。
  • 您想用and 运算符实现什么目标?您的意思是按位进行and 还是尝试按第一列然后随机排序?在这种情况下,您应该使用逗号而不是 and
  • @siride, ORDER BY 1, RAND(1) 将首先按主键 id 列排序,然后如果存在平局则按随机值排序 - 假设 id 是主键,则永远不会存在.
  • @BillKarwin:它也没有意义,但它至少符合 ORDER BY 子句的工作方式。

标签: mysql random sql-order-by


【解决方案1】:

您可以在查询中查看表达式的结果:

mysql> select *, 1, rand(1), 1 and rand(1) from new_table order by 1 and rand(1);
+----+------+----------+---+---------------------+---------------+
| id | name | password | 1 | rand(1)             | 1 and rand(1) |
+----+------+----------+---+---------------------+---------------+
|  1 | ghi  | 111      | 1 | 0.40540353712197724 |             1 |
|  3 | abc  | 234      | 1 |  0.1418603212962489 |             1 |
|  5 | 5    | 5        | 1 | 0.04671454713373868 |             1 |
|  7 | 7    | 7        | 1 |     0.6108337804776 |             1 |
|  2 | jkl  | 123      | 1 |  0.8716141803857071 |             1 |
|  4 | def  | 555      | 1 | 0.09445909605776807 |             1 |
|  6 | 6    | 6        | 1 |  0.9501954782290342 |             1 |
+----+------+----------+---+---------------------+---------------+

看看 boolean 表达式如何总是产生1

正如@Barmar 所述,任何表达式1 and n 的结果都是0 或1,具体取决于n 的值是零还是非零。

所以你的表达式 ORDER BY 1 AND RAND(1) 就像 ORDER BY true (一个常量表达式),这意味着排序是每一行之间的联系,MySQL 以任意方式对它们进行排序。

但是任意随机是不一样的。

【讨论】:

  • 感谢您的回答。原来这是一个错误。
  • 这与那个关于WHERE 子句的错误有什么关系? ORDER BY 不是条件。
  • @Barmar,如果表达式的计算不正确,它可能会影响使用该表达式的任何地方。但我自己并没有重现该错误。
猜你喜欢
  • 2010-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多