为2个表mysql之间的每组匹配选择最小匹配

时间:2018-01-24 18:16:32

标签: 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;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| value | int(11) | NO   |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+
describe bar;
+-------+---------+------+-----+---------+----------------+
| Field | Type    | Null | Key | Default | Extra          |
+-------+---------+------+-----+---------+----------------+
| id    | int(11) | NO   | PRI | NULL    | auto_increment |
| value | int(11) | NO   |     | NULL    |                |
+-------+---------+------+-----+---------+----------------+

在这个简单的例子中,假设表格填写如下

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中的每一行,我想得到bar中列的id,其中bar的值是最大值,大于foo的值。那是我想要检索像

这样的表
+--------+--------+-----------+-----------+
| 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     |
+--------+--------+-----------+-----------+

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

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

但我无法弄清楚如何在每个foo ID组中找到最小的bar值。我所看到的大多数其他问题都假设你试图从一个表而不是多个表中执行此操作。

1 个答案:

答案 0 :(得分:1)

此查询应该为您完成:

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
)

Here是指向sqlfiddle的链接,您可以在其中查看它的实际效果。