一尘不染

MySQL行子查询比较问题

sql

我有一个小的mysql表(MySQL版本5.6.23):

+-----------+-----------------+------+-----+---------+----------------+
| Field     | Type            | Null | Key | Default | Extra          |
+-----------+-----------------+------+-----+---------+----------------+
| id        | int(6) unsigned | NO   | PRI | NULL    | auto_increment |
| dividends | float(8,6)      | YES  |     | NULL    |                |
+-----------+-----------------+------+-----+---------+----------------+

我的where子句遵循row-subqueries语法。
如果我做:

SELECT id, dividends FROM test  
  where  (id,dividends) >= (660,0.5);

或者

SELECT id, dividends FROM test 
  where  (id,dividends) >= (660,CAST(0.5 AS DECIMAL(8,6)));

我得到这个结果:

+-----+-----------+
| id  | dividends |
+-----+-----------+
| 660 |  0.500000 |
| 661 |  0.470000 |
| 662 |  0.470000 |
| 663 |  0.470000 |
| 664 |  2.580000 |
| 665 |  2.581000 |
...

在我看来,没有考虑股息> = 0.5。为什么?


阅读 157

收藏
2021-05-16

共1个答案

一尘不染

您正在使用行构造函数。MySQL将它们完全像 表中的行 一样对待。因此,WHERE (id,dividends) >=(660,0.5)有效地执行以下操作:

  1. ORDER BY id,dividends;

  2. 找到该(660,0.5)顺序中的点;

  3. 仅筛选等于或大于排序中该点的那些记录。

因此,它与相同WHERE (id=660 AND dividends>=0.5) OR id>660

看来您真正想表达的逻辑是WHERE id>=660 AND dividends>=0.5

2021-05-16