2

foo.val > bar.val である bar の最大値と結合された foo のすべての値を返そうとしています。

CREATE TABLE `foo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `val` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

CREATE TABLE `bar` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `val` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
);

insert into foo (val) values (3), (5), (7), (10);
insert into bar (val) values (1), (1), (2), (3), (4), (5), (6), (7), (8), (20);

予想される出力は次のようになります。

+--------+---------+------------------------+
| foo.id | foo.val | max(bar.val) < foo.val |
+--------+---------+------------------------+
|  1     | 3       | 2                      |
|  2     | 5       | 4                      |
|  3     | 7       | 6                      |
|  4     | 10      | 8                      |
+--------+---------+------------------------+

コードランドでループするのではなく、単一のクエリでこれを実行できますか?

SELECT max(val) from bar where val < 3;
SELECT max(val) from bar where val < 5;
SELECT max(val) from bar where val < 7;
SELECT max(val) from bar where val < 10;

誰でもこれについて何か考えがありますか?

誰かがそれを試してみたいなら、フィドルはここにありますhttp://sqlfiddle.com/#!2/de0f9/7

前もって感謝します。

4

3 に答える 3

3
select  foo.id
,       foo.val
,       max(bar.val)
from    foo
left join
        bar
on      bar.val < foo.val
group by
        foo.id
,       foo.val

SQL Fiddle での例(JohnWhoo に感謝)

于 2012-11-08T15:13:39.880 に答える
2
select  foo.id,
        foo.val,
        (select MAX(bar.val) from bar where bar.val < foo.val) as barval
from foo

それより小さい値がバーに見つからない場合は null を返します。値が必要な場合は、coalesce を使用してください。

于 2012-11-08T15:20:00.780 に答える
0
SELECT f.id, f.val, (SELECT MAX(b.val) FROM bar b WHERE b.val<f.val) FROM foo f;
于 2012-11-08T15:21:22.613 に答える