Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.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 flatter sqflite从一个表中获取所有数据以及它';s子表_Sql_Flutter_Sqlite - Fatal编程技术网

Sql flatter sqflite从一个表中获取所有数据以及它';s子表

Sql flatter sqflite从一个表中获取所有数据以及它';s子表,sql,flutter,sqlite,Sql,Flutter,Sqlite,我有两个表定义了一个任务,它是子任务: db.transaction((Transaction txn) async { txn.execute("CREATE TABLE ${Tasks.tblTask} (" "${Tasks.dbId} INTEGER PRIMARY KEY AUTOINCREMENT," "${Tasks.dbServerId} INTEGER,"

我有两个表定义了一个任务,它是子任务:

 db.transaction((Transaction txn) async {
      txn.execute("CREATE TABLE ${Tasks.tblTask} ("
          "${Tasks.dbId} INTEGER PRIMARY KEY AUTOINCREMENT,"
          "${Tasks.dbServerId} INTEGER,"
          "${Tasks.dbTitle} TEXT,"
          "${Tasks.dbCreateTime} LONG,"
          "${Tasks.dbComment} TEXT,"
          "${Tasks.dbCommentUpdateTime} LONG,"
          "${Tasks.dbDueDate} LONG,"
          "${Tasks.dbDueTime} LONG,"
          "${Tasks.dbCompleteTime} LONG,"
          "${Tasks.dbPriority} LONG,"
          "${Tasks.dbProjectID} LONG,"
          "${Tasks.dbTaskTypeID} LONG,"
          "${Tasks.dbStatus} LONG,"
          "${Tasks.dbTaskColorName} TEXT,"
          "${Tasks.dbTaskColorCode} INTEGER,"
          "${Tasks.dbRepeatedType} INTEGER,"
          "${Tasks.dbRepeatedId} INTEGER,"
          "${Tasks.dbRepeatedPer} INTEGER,"
          "${Tasks.dbRepeatedUnit} INTEGER,"
          "${Tasks.dbRepeatedNumbers} TEXT,"
          "${Tasks.dbUserAddr} TEXT,"
          "${Tasks.dbProgress} REAL,"
          "${Tasks.dbCostTime} INTEGER,"
          "${Tasks.dbShared} INTEGER,"
          "FOREIGN KEY(${Tasks.dbProjectID}) REFERENCES ${Project.tblProject}(${Project.dbId}) ON DELETE CASCADE "
          "UNIQUE (${Tasks.dbCreateTime}));");


db.transaction((Transaction txn) async {
      txn.execute("CREATE TABLE ${SubTask.tblSubTask} ("
          "${SubTask.dbId} INTEGER PRIMARY KEY AUTOINCREMENT,"
          "${SubTask.dbTaskId} LONG,"
          "${SubTask.dbTaskServerId} LONG,"
          "${SubTask.dbServerId} LONG,"
          "${SubTask.dbUserAddr} TEXT,"
          "${SubTask.dbTitle} TEXT,"
          "${SubTask.dbComment} TEXT,"
          "${SubTask.dbCommentUpdateTime} LONG,"
          "${SubTask.dbDueTime} LONG,"
          "${SubTask.dbCompleteTime} LONG,"
          "${SubTask.dbCreateTime} LONG,"
          "${SubTask.dbPriority} LONG,"
          "${SubTask.dbTaskTypeID} LONG,"
          "${SubTask.dbStatus} LONG,"
          "${SubTask.dbTaskColorName} TEXT,"
          "${SubTask.dbTaskColorCode} INTEGER,"
          "${SubTask.dbProgress} REAL,"
          "${SubTask.dbCostTime} INTEGER,"
          "FOREIGN KEY(${SubTask.dbTaskId}) REFERENCES ${Tasks.tblTask}(${Tasks.dbId}) ON DELETE CASCADE "
          "UNIQUE (${SubTask.dbCreateTime}));");
    });
这就是我定义2表的方式

现在,我想从表中获取所有任务,我应该如何获取所有任务及其子任务

注意:任务可能包含多个子任务


更新

我尝试了这个SQL查询,它返回我的子任务,但只返回第一个子任务(rest无法检索):

我想要的是返回我的[Task,Task,Task,Task….]列表

在某些任务中,它将有一个列表[子任务,子任务…] 所以它看起来像:

[任务[子任务,子任务],任务,任务[子任务,子任务,子任务]]


正如我在第一个答案中提到的我已经尝试了查询任务,并循环它,然后查询任务的子任务,但是这很慢!!!我已经不赞成这种方式了!!我需要一个SQL语句或至少是最有效的方法来实现这一点

也许下面的代码可以解决您的问题。我这么说可能是因为我不知道你的任务、子任务模型是怎样的。此外,在运行的更新查询中,您似乎有更多的模型,如Project等。 我坚持任务和子任务,因为你们的问题只涉及这两个方面。对代码进行适度注释,以突出其目的或假设


未来的GetTaskWithSubTasks()异步{
final Database db=wait Database;//获取数据库实例
最终res=等待分贝
.query(Tasks.dbId);//检索所有任务及其所有属性
List taskList=res.isNotEmpty
?res.map((c)=>Task.fromJson(c)).toList()
:[];//映射到域中的对象
//现在,根据任务的'id'检索与任务关联的所有子任务,并将它们添加到任务中
//我假设您的'Task'模型有一个属性subtasks,它是一个列表
for(任务列表中的var任务){
var subtasksRaw=await db.query(SubTask.tblSubTask,
哪里:
“${SubTask.dbTaskId}=${task.id}”);//假设任务有一个属性'id'`
列表子任务列表=
res.isNotEmpty?res.map((c)=>SubTask.fromJson(c)).toList():[];
task.subtask.addAll(subtaskList);
}
//现在我们的模型应该是您想要的[任务[子任务,子任务],任务[],任务[子任务,子任务,子任务]]。
返回任务列表;
}

如果只需要与任务相关的子任务,则SQL查询如下:

SELECT
  task.id as task_id,
  task.name as task_name,
  sub_task.name as subtask_name,
  sub_task.id as subtask_id
FROM task
LEFT JOIN sub_task
ON task.id = sub_task.task_id
WHERE task.id = 2
假设您的任务表类似于:

id  name
1   task 1
2   task 2
3   task 3
您的子任务表如下所示:

id  name          task_id
1   sub task 1    1
2   sub task 2    2
3   sub task 3    1
4   sub task 4    1
5   sub task 5    3
6   sub task 6    1
7   sub task 7    3
8   sub task 8    2
9   sub task 9    1
10  sub task 10   null
11  sub task 11   null
12  sub task 12   null
查询结果如下所示:

task_id task_name   subtask_name    subtask_id
2       task 2      sub task 2      2
2       task 2      sub task 8      8
然后,您可以轻松使用结果创建所需的结构:

Future getTasksWithSubtasks()异步{
final Database db=wait Database;//获取数据库实例
//res是这样的:
/*
[
{
任务编号:2,
任务名称:“任务2”,
子任务名称:“子任务2”,
子任务id:2
},
{
任务编号:2,
任务名称:“任务2”,
子任务名称:“子任务8”,
子任务id:8
}
]
*/
最终列表res=wait db.rawQuery(“”)
挑选
task.id作为task_id,
task.name作为task_name,
sub_task.name作为subtask_name,
子任务id作为子任务id
从任务
左连接子任务
ON task.id=sub_task.task_id
其中task.id=2
“”;//检索具有相关子任务的所有任务
列出任务=[];
var pos=-1;
无功电流=-1;
对于(变量i=0;i
注意:您可以调整单个任务和相关子任务的SQL查询和方法

示例数据SQL

如果任务存在,则删除表;
创建表任务(
id int,
名称varchar
);
在任务(id、名称)中插入值(1,“任务1”);
在任务(id、名称)中插入值(2,“任务2”);
在任务(id、名称)中插入值(3,“任务3”);
如果存在子任务,则删除表;
创建表子任务(
id int,
名字叫瓦查尔,
任务id int
);
在子任务(id、名称、任务id)中插入值(1,“子任务1”,1);
在子任务(id、名称、任务id)中插入值(2,“子任务2”,2);
在子任务(id、名称、任务id)中插入值(3,“子任务3”,1);
在子任务(id、名称、任务id)中插入值(4,“子任务4”,1);
在子任务(id、名称、任务id)中插入值(5,“子任务5”,3);
在子任务(id、名称、任务id)中插入值(6,“子任务6”,1);
在子任务(id、名称、任务id)中插入值(7,“子任务7”,3);
在子任务(id、名称、任务id)中插入值(8,“子任务8”,2);
在子任务(id、名称、任务id)中插入值(9,“子任务9”,1);
在子任务(id、名称、任务id)中插入值(10,“子任务10”);
插入子任务(id、名称、任务id)值(11,“子任务11”);
插入子任务(id、名称、任务id)值(12,“子任务12”);

我只需要一个SQL查询来获取所有任务和子任务。我发现SQL无法查询项及其子列表项,因此请帮助发布示例数据和预期结果,以澄清您的需求。我只需要一个SQL语句来获取数据,我得到了一个简短的结果,希望与示例数据共享。我无法提供完整的示例,因为这是Flatter项目。如果您理解我的问题,我只需要一个SQL语句查询出所有任务,子任务属于每个任务。我已经更新了我的表c
task_id task_name   subtask_name    subtask_id
2       task 2      sub task 2      2
2       task 2      sub task 8      8