SQLite按少COUNT加入多个表排序

问题描述 投票:2回答:1

我有这个数据库结构:

enter image description here

我需要显示users,它可以在一个特定的日子执行一个确定类型的Task,首先显示分配给那天的Tasks(或没有任何Task)的结果。

例如:

  • User A当天分配了1个Task类型1。
  • User B当天分配了3个Task类型1。
  • User C当天没有指定类型1的Task

我想按以下顺序显示它们:用户C>用户A>用户B.

这是我的查询:

SELECT  *, COUNT(*)
FROM USER U
INNER JOIN USER_TASK_TYPE UT ON (U._id=UT.user_id)
LEFT JOIN TASK T ON (U._id = T.user_id)
where UT.TASK_TYPE_ID = ?
where T.CREATION_DATE = ?
GROUP BY T.user_id
ORDER BY COUNT(*) ASC;

有些事情仍然是错误的,因为如果一个User分配了1个任务,而另一个User没有,那么首先显示第一个User

我很感激任何帮助。谢谢。

sqlite join group-by count
1个回答
2
投票

首先,提供的模式不反映正在使用的查询: -

  • 任务表中没有creation_date列。
  • 用户表的id列应为_id。

其次,由于WHERE被编码两次,您提供的查询将导致语法错误。

您对哪些数据存在的描述不清楚,例如:你说 :-

用户A当天分配了1个类型1的任务

什么表中存在哪些行?

作为猜测,使用了以下内容

  • 注意到: - 存在多个用户,其中不存在任务 并且存在当天没有任务存在的用户

:-

-- DROP and Recreate/Create tables
DROP TABLE IF EXISTS user;
DROP TABLE IF EXISTS task;
DROP TABLE IF EXISTS task_type;
DROP TABLE IF EXISTS user_task_type;
CREATE TABLE IF NOT EXISTS user (_id INTEGER PRIMARY KEY,  name TEXT, user_id INTEGER, user_name TEXT, password TEXT, user_type TEXT);
CREATE TABLE IF NOT EXISTS task(id INTEGER PRIMARY KEY, creation_date TEXT, description TEXT, duration int, status TEXT, user_id INTEGER, task_type_id INTEGER);
CREATE TABLE IF NOT EXISTS task_type(id INTEGER PRIMARY KEY, name TEXT);
CREATE TABLE IF NOT EXISTS user_task_type (id INTEGER PRIMARY KEY, user_id INTEGER, task_type_id INTEGER);

-- Add some users
INSERT INTO user (name,password,user_type) VALUES
    ('USER1','x','x'),('USER2','x','x'),('USER3','x','x'),('USER4','x','x'),('USER5','x','x'); 

-- Add some task types
INSERT INTO task_type (name) VALUES
    ('Sweep'),('Wash'),('Polish'),('Scrub');

-- Add some tasks for users
INSERT INTO task (creation_date, description, duration, status, user_id, task_type_id) VALUES
    ('2018-01-01','USER1 TASK01',10,'to be done', 1,1),
    ('2018-01-01','USER2 TASK01',10,'to be done', 2,1),
    ('2018-01-01','USER2 TASK01',10,'to be done', 2,1),
    ('2018-01-01','USER2 TASK01',10,'to be done', 2,1),
    ('2018-02-02', 'USER3 NOT ON THE DAY',10,'to be done another day',3,1) --<<<< for testing user on another day
    -- ('2018-01-01','???????',10,'????????',3,1); commented out used for testing
    ;

-- unclear what this is used for but match tasks SUPERFLUOUS?
INSERT INTO user_task_type (user_id, task_type_id) VALUES
    (1,1),(2,1),(2,1),(2,1),(3,1),
    (3,1) -- added a spurious row;
    ;

SELECT  *, COUNT(*)
FROM USER U
    JOIN USER_TASK_TYPE UT ON (U._id=UT.user_id)
    JOIN TASK T ON (U._id = T.user_id)
WHERE UT.TASK_TYPE_ID = 1
-- WHERE T.CREATION_DATE = '2018-01-01' <<<<<<<<<< Invalid used the following line
AND T.CREATION_DATE = '2018-01-01' -- <<<<<<<<<< assumed AND
GROUP BY T.user_id
ORDER BY COUNT(*) ASC;

结果似乎是预期的(没有任务或当天没有任务的用户没有虚假行)。但是,计数不是预期的,而是计数的平方。 : -

enter image description here

我相信计数的问题是使用/使用user_task_type表,这似乎是多余的并且有问题。所以以下内容很可能符合您的要求: -

SELECT  *, COUNT(*)
FROM USER U
    -- INNER JOIN USER_TASK_TYPE UT ON (U._id=UT.user_id)
    JOIN TASK T ON (U._id = T.user_id)
    JOIN task_type tt ON tt.id = t.task_type_id
WHERE  tt.id = 1 AND T.CREATION_DATE = '2018-01-01'
GROUP BY T.user_id
ORDER BY COUNT(*) ASC;

这导致: -

enter image description here

  • 即user_task_type表尚未加入,因为它似乎没有任何用途,并且计数符合预期
© www.soinside.com 2019 - 2024. All rights reserved.