Mysql 为两个表之间的每组匹配选择最小匹配

Mysql 为两个表之间的每组匹配选择最小匹配,mysql,Mysql,我尝试根据mysql中每个表的列之间的关系查询两个表: CREATE TABLE foo (id INTEGER NOT NULL AUTO_INCREMENT, value INTEGER NOT NULL, PRIMARY KEY(id)); CREATE TABLE bar (id INTEGER NOT NULL AUTO_INCREMENT, value INTEGER NOT NULL, PRIMARY KEY(id)); describe foo; 在这个简单的示例中,假设表格

我尝试根据mysql中每个表的列之间的关系查询两个表:

CREATE TABLE foo (id INTEGER NOT NULL AUTO_INCREMENT, value INTEGER NOT NULL, PRIMARY KEY(id));
CREATE TABLE bar (id INTEGER NOT NULL AUTO_INCREMENT, value INTEGER NOT NULL, PRIMARY KEY(id));

describe foo;
在这个简单的示例中,假设表格按如下方式填充

INSERT INTO foo (value) VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
INSERT INTO bar (value) VALUES(5), (8), (9), (2), (10);

select * from foo;
现在,对于foo中的每一行,我想获得bar中列的id,其中bar的值是大于foo值的最小值。那就是我想检索一个表,如

请注意,foo第10行在条形图中没有大于其值的对应行,因此它不会被选中。我知道如何找到bar中的值大于foo中的值的所有对:

SELECT foo.id as foo_id, bar.id as bar_id from foo, bar where foo.value < bar.value;

但我不知道如何在每个foo-id分组中找到bar的最小值。我看到的大多数其他问题都假设您是从一个表而不是多个表来完成这项工作的

此查询应该可以为您完成:

SELECT foo.id as `foo.id`, bar.id AS `bar.id`, foo.value AS `foo.value`, bar.value AS `bar.value`
FROM foo
INNER JOIN bar ON bar.value = (
  SELECT MIN(bar.value) FROM bar WHERE foo.value < bar.value
)

是指向sqlfiddle的链接,您可以在其中看到它的运行情况。

这是一个完美的链接,比我尝试过的所有操作都简单得多!很高兴它有帮助!
INSERT INTO foo (value) VALUES(1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
INSERT INTO bar (value) VALUES(5), (8), (9), (2), (10);

select * from foo;
+----+-------+
| id | value |
+----+-------+
|  1 |     1 |
|  2 |     2 |
|  3 |     3 |
|  4 |     4 |
|  5 |     5 |
|  6 |     6 |
|  7 |     7 |
|  8 |     8 |
|  9 |     9 |
| 10 |    10 |
+----+-------+
select * from bar;
+----+-------+
| id | value |
+----+-------+
|  1 |     5 |
|  2 |     8 |
|  3 |     9 |
|  4 |     2 |
|  5 |    10 |
+----+-------+
+--------+--------+-----------+-----------+
| foo.id | bar.id | foo.value | bar.value |
+--------+--------+-----------+-----------+
|    1   |    4   |     1     |     2     |
|    2   |    1   |     2     |     5     |
|    3   |    1   |     3     |     5     |
|    4   |    1   |     4     |     5     |
|    5   |    2   |     5     |     8     |
|    6   |    2   |     6     |     8     |
|    7   |    2   |     7     |     8     |
|    8   |    3   |     8     |     9     |
|    9   |    5   |     9     |    10     |
+--------+--------+-----------+-----------+
SELECT foo.id as foo_id, bar.id as bar_id from foo, bar where foo.value < bar.value;
SELECT foo.id as `foo.id`, bar.id AS `bar.id`, foo.value AS `foo.value`, bar.value AS `bar.value`
FROM foo
INNER JOIN bar ON bar.value = (
  SELECT MIN(bar.value) FROM bar WHERE foo.value < bar.value
)