在视图中查询子查询中的值

时间:2016-10-14 10:54:10

标签: sql sqlite

作为一个例子,我设置了一个简单的SQLite模式:

sqlite> CREATE TABLE foo (a TEXT, b INT, PRIMARY KEY(a, b));
sqlite> INSERT INTO foo (a, b) VALUES ('x', 5);
sqlite> INSERT INTO foo (a, b) VALUES ('x', 10);
sqlite> INSERT INTO foo (a, b) VALUES ('x', 15);
sqlite> INSERT INTO foo (a, b) VALUES ('y', 5);
sqlite> INSERT INTO foo (a, b) VALUES ('y', 12);
sqlite> INSERT INTO foo (a, b) VALUES ('y', 16);

b表示时间戳,a表示对象。当然,真正的应用程序包含更多列。

我想创建一个视图,其中包含(a, b)到下一个较小值b的映射,foo中存在一个条目。对于上面的例子,它应该是这样的:

a  | b   | previous_b
---------------------
x  | 10  | 5
x  | 15  | 10
y  | 12  | 5
y  | 16  | 12

我尝试创建这样的视图:

CREATE VIEW prev
AS
    SELECT
        a,
        b AS current_b,
        (SELECT MAX(b) FROM foo WHERE b < current_b) AS previous_b
FROM foo;

但是,我似乎无法访问子查询中的current_b

sqlite> SELECT * FROM prev;
Error: no such column: current_b

我该如何解决这个问题?如果这是不可能的,还有其他选择吗?

2 个答案:

答案 0 :(得分:2)

你不能使用这样的别名。使用

module.exports = new polls();

答案 1 :(得分:2)

您想要使用相关子查询。因此,您需要表别名和限定列名:

<?php
$string = "category=123&code=456&type=type111&type=type222";

$repeated_key = 'type';
$variable = explode('&', $string);
$data_o = array();
foreach ($variable as $key0 => $value0) {
$subvariable = explode('=', $value0);
if($subvariable[0] == $repeated_key){
    continue;
}
$data_o[$subvariable[0]] = $subvariable[1];
}
$i=0;
foreach ($variable as $key1 => $value1) {
$subvariable = explode('=', $value1);
if($subvariable[0] != $repeated_key){
    continue;
}
$data_t = array();
$data_t['type'] = $subvariable[1];
$data[] = array_merge($data_o,$data_t);
$i++;
}
echo "<pre>";
print_r($data);
exit;

?>

您应始终使用表别名和限定列名,尤其是在学习SQL时。在学习语言时养成正确的习惯。