首页 文章

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

提问于
浏览
1

我有两个表,我试图根据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;

|领域|输入|空|钥匙|默认|额外的|


| id | int(11)|没有| PRI | NULL | auto_increment |
| Value | int(11)|没有| | NULL | |


describe bar;

|领域|输入|空|钥匙|默认|额外的|


| id | int(11)|没有| PRI | NULL | auto_increment |
| Value | int(11)|没有| | 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 回答

  • 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的链接,您可以在其中查看它的实际效果 .

相关问题