Как считать строки из внутренней объединенной таблицы - PullRequest
0 голосов
/ 18 ноября 2018

Я собираю всю информацию для решений с использованием таблиц с перекрестными ссылками.

SELECT
    s.*, u.forname, u.surname, u.email, u.tel, p.type
FROM _user_solution s
INNER JOIN _users u
    ON s.uid = u.uid
INNER JOIN _payment_plans p
    ON p.pid = s.payment_plan_type

Это работает нормально, и мои результаты соответствуют ожиданиям.Тем не менее, у меня есть еще одна таблица, которая содержит задачи для этого решения, каждая задача имеет прогресс.Я хочу выяснить, сколько задач имеет это решение, я попытался:

SELECT
    s.*, u.forname, u.surname, u.email, u.tel, p.type,
    (SELECT COUNT(*) FROM t WHERE t.progress < 100 AS task)
FROM _user_solution s
INNER JOIN _users u
    ON s.uid = u.uid
INNER JOIN _payment_plans p
    ON p.pid = s.payment_plan_type
INNER JOIN _solution_tasks t
    ON s.sid = t.assigned_for_solution

Но я получаю эту ошибку:

У вас есть ошибка в синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с «задачей AS». _ _ user_solution s INNER JOIN _users u ON s.uid = u.uid 'в строке 3

Anyидеи о том, как я могу сосчитать все задачи, которые являются неполными для этого решения, будут высоко оценены.

Ответы [ 4 ]

0 голосов
/ 18 ноября 2018

Я изменил ваш запрос на это, и он работает:

<code>
SELECT
    s.*, u.forname, u.surname, u.email, u.tel, p.type,
    (SELECT COUNT(WRITE_AUTOINCREMENT_ID) AS task FROM t WHERE t.progress < 100)
FROM _user_solution AS s
INNER JOIN _users AS u
    ON s.uid = u.uid
INNER JOIN _payment_plans p
    ON p.pid = s.payment_plan_type
INNER JOIN _solution_tasks AS ttable
    ON s.sid = ttable.assigned_for_solution
0 голосов
/ 18 ноября 2018

вы можете попробовать как ниже

SELECT
    s.*, u.forname, u.surname, u.email, u.tel, p.type,
    (SELECT COUNT(*) 
          FROM another_table tt1 
          WHERE tt1.taskID=t.taskID --assume taskID is join key 
         and tt1.progress < 100 
    ) AS task
FROM _user_solution s
INNER JOIN _users u
    ON s.uid = u.uid
INNER JOIN _payment_plans p
    ON p.pid = s.payment_plan_type
INNER JOIN _solution_tasks t
    ON s.sid = t.assigned_for_solution
0 голосов
/ 18 ноября 2018

Мне удалось выяснить, как это сделать, мне нужно было поставить прогресс в предложении WHERE внизу, потому что это то, против чего я пытаюсь все это сделать, а затем мне нужно выбрать COUNT(*)

SELECT
    s.*, u.forname, u.surname, u.email, u.tel, p.type, COUNT(*) as tasks
FROM _user_solution s
INNER JOIN _users u
    ON s.uid = u.uid
INNER JOIN _payment_plans p
    ON p.pid = s.payment_plan_type
INNER JOIN _solution_tasks t
    ON s.sid = t.assigned_for_solution
WHERE t.progress < 100

Теперь я показываю, сколько задач выделено для этого решения.После небольшого количества исследований первый COUNT выходит как 0, как индекс массива, начинающийся с 0, так что в этом случае строка решения сама выдает 0, а затем каждая задача, связанная с решением, добавляет 1, давая мне правильное кратноезадачи.

0 голосов
/ 18 ноября 2018

Вам нужно переместить часть псевдонима AS task за пределы подзапроса;вне закрывающей скобки.

SELECT
    s.*, u.forname, u.surname, u.email, u.tel, p.type,
    (SELECT COUNT(*) FROM _solution_tasks WHERE progress < 100) AS task
FROM _user_solution s
INNER JOIN _users u
    ON s.uid = u.uid
INNER JOIN _payment_plans p
    ON p.pid = s.payment_plan_type
INNER JOIN _solution_tasks t
    ON s.sid = t.assigned_for_solution
...