Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
sql one查询为所选标识符选择最大/最小值(每个标识符都有某种类型?)_Sql_Sqlite - Fatal编程技术网

sql one查询为所选标识符选择最大/最小值(每个标识符都有某种类型?)

sql one查询为所选标识符选择最大/最小值(每个标识符都有某种类型?),sql,sqlite,Sql,Sqlite,我有简单的sql结构: CREATE TABLE main_tbl( id INTEGER PRIMARY KEY ASC, start_time TEXT NOT NULL, ); CREATE TABLE second_tbl ( id INTEGER PRIMARY KEY AUTOINCREMENT, data BL

我有简单的sql结构:

CREATE TABLE main_tbl(
                id INTEGER PRIMARY KEY ASC,
                start_time TEXT NOT NULL,
                );

CREATE TABLE second_tbl (
                id     INTEGER PRIMARY KEY AUTOINCREMENT,
                data   BLOB,
                m_id   INTEGER NOT NULL,
                FOREIGN KEY(m_id) REFERENCES main_tbl(id) ON DELETE CASCADE
                );

CREATE INDEX m_id_idx ON second_tbl (m_id);
CREATE INDEX start_time_idx ON main_tbl (start_time);
并想从
main\u tbl
中查找一些项目:

通过开始时间描述限制X偏移量Y从主订单选择id、开始时间

然后对于所选的
main_tbl.id
find min/max集合:

  SELECT data FROM second_tbl WHERE m_id=chosen_id AND SOME_CONDITION ORDER BY second_tbl.id ASC LIMIT 1
  UNION
  SELECT data FROM second_tbl WHERE m_id=chosen_id AND SOME_CONDITION ORDER BY second_tbl.id DESC LIMIT 1
在伪语言上,它如下所示:

foreach chosen_id IN (SELECT id,start_time FROM main_tbl ORDER BY start_time DESC LIMIT X OFFSET Y)
  SELECT data FROM second_tbl WHERE m_id=chosen_id AND SOME_CONDITION ORDER BY second_tbl.id ASC LIMIT 1
  UNION
  SELECT data FROM second_tbl WHERE m_id=chosen_id AND SOME_CONDITION ORDER BY second_tbl.id DESC LIMIT 1
但是如何在一个SQL查询中编写它(实际上是SQL的sqlite子集)

如果我写:

WITH chosen_ids(id,data) AS (SELECT id,start_time FROM main_tbl ORDER BY start_time DESC LIMIT X OFFSET Y)
  SELECT data FROM second_tbl WHERE m_id IN (SELECT id from chosen_ids) AND SOME_CONDITION ORDER BY second_tbl.id ASC LIMIT 1
然后,我为所有
选定的\u id
获取mininim,而我需要为每个id获取mininim

如果我使用
JOIN
而不是
WITH
,我只能为整个连接查询设置
LIMIT/OFFSET
,而不仅仅是
SELECT
from
main\u tbl

更新

示例数据:

sqlite>SELECT id,通过start\u time DESC LIMIT 5 OFFSET 100从主订单开始计时;
900 | 2019-03-14T08:36:26.324937205+00:00
899 | 2019-03-14T06:36:26.324937205+00:00
898 | 2019-03-14T04:36:26.324937205+00:00
897 | 2019-03-14T02:36:26.324937205+00:00
896 | 2019-03-14T00:36:26.324937205+00:00
然后我运行了896-900的子查询,下面是900的示例:

sqlite>从second_-tbl中选择quote(数据),其中m_-id=900,并且数据不是second_-tbl.id ASC LIMIT 1的空顺序;
X'00000000 8A128A5C00000000F5255E130000000000000F03F0000000000000040000000000000840000000000000104000000000000000000000001440010000000000001840'
sqlite>从second_tbl中选择quote(data),其中m_id=900,并且数据不为空,顺序为second_tbl.id DESC LIMIT 1;
X'00000000 AA2E8A5C00000000F54468000000000000000000000000F03F000000000000004000000000000084000000000000010400000000000000000000000000001440010000000000001840'

好吧,您可以使用以下命令将其编写为一个查询:

SELECT m.id, m.start_time, MIN(s.data) as min_data, MAX(s.data) as max_data
FROM main_tbl m LEFT JOIN
     second_tbl s
     ON s.m_id = m.id
GROUP BY m.id
ORDER BY start_time DESC
LIMIT X OFFSET Y;
编辑:

可以使用相关子查询:

SELECT m.id, m.start_time, 
       (SELECT s.data FROM second_tbl s WHERE m.m_id = s.chosen_id AND SOME_CONDITION ORDER BY s.id ASC LIMIT 1) as min_data,
       (SELECT s.data FROM second_tbl s WHERE m.m_id = s.chosen_id AND SOME_CONDITION ORDER BY s.id DESC LIMIT 1) as max_data
FROM main_tbl m 
ORDER BY start_time DESC
LIMIT X OFFSET Y;

示例数据和所需结果将非常有用。@GordonLinoff我用示例数据更新我的问题我不需要MIN作为数据,请参阅我按秒顺序执行
ASC/DESC LIMIT 1
加上对于最小/最大搜索,我只选择一些行(这是
某些条件
),但这可能并不重要。让我考虑一下。谢谢,但是出于某种原因,第二个查询为每一行返回相同的
m.id
?我将
m.m\u id=s.selected\u id
替换为
m.id=s.m\u id
,并运行您的查询,但由于某些原因,它报告的
X(限制)
次数相同
m.id