mySQL - передать идентификатор во вложенный запрос - PullRequest
3 голосов
/ 06 октября 2011

Я пытаюсь получить сумму сумм двух разных столбцов из одной таблицы, сгруппированных по пользователям.Проблема в том, что одна из сумм, которую я должен найти, требует дополнительных параметров.

Таблица 1:

userid, fname, lname

Таблица 2:

assigned_to (is = to userid from other table), 
est_hours (est = Estimate hours),
act_hours (act = Actual Hours), 
completed_date 

Я хочу толькоest_hours из записей, которые были помечены как завершенные (путем указания значения в столбце complete_date. act_hours будет пустым, если в поле complete_date пусто)

Проблема с моим запросом заключается в том, что я не получаю правильные значения длясумма act_hours и est_hours.Я думаю, что это связано с вложенным запросом, не совпадающим с правильным идентификатором пользователя.Запрос:

SELECT userid, 
       fname, 
       lname, 
       SUM(act_hours)+(SELECT SUM(est_hours) 
                       from Table2 
                       WHERE completed_date IS NULL) AS total_hours 
FROM TABLE2, 
TABLE1 
WHERE TABLE1.userid = TABLE2.assigned_to 
GROUP BY userid;

Я знаю, что мне нужно каким-то образом передать идентификатор пользователя из запроса OUTER во внутренний запрос, чтобы SUM (est_hours) получал только сумму для этого пользователя.

Я продолжаю ходить кругами, и мой мозг болит, поэтому любая помощь приветствуется !!

Ответы [ 2 ]

3 голосов
/ 06 октября 2011

Не используйте неявный синтаксис объединения, это анти-шаблон

Вместо этого используйте явные объединения:

SELECT 
  t1.userid, 
  t1.fname, 
  t1.lname, 
  SUM(t2.act_hours)+(SELECT SUM(t3.est_hours) 
                     FROM Table2 t3
                     WHERE t3.completed_date IS NULL
                       AND t3.assigned_to = t1.userid) AS total_hours 
FROM table2 t2
INNER JOIN table1 t1 ON (t1.userid = t2.assigned_to)
GROUP BY userid;

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

2 голосов
/ 06 октября 2011

Это действительно в SQL Server, попробуйте в MYSQL, может работать:

SELECT userid, 
       fname, 
       lname, 
       (SELECT SUM(est_hours)+SUM(act_hours) 
                       from Table2 
                       WHERE completed_date IS NULL and TABLE2.assigned_to=TABLE1.userid) AS total_hours 
FROM 
TABLE1 

ОК, возвращаясь к моему первоначальному запросу ...

SELECT userid, 
       fname, 
       lname, 
       SUM(act_hours)+(SELECT SUM(est_hours) 
                       from Table2 
                       WHERE completed_date IS NULL 
                       AND Table2.assigned_to=Table1.userid) 
       AS total_hours 
FROM TABLE2, 
TABLE1 
WHERE TABLE1.userid = TABLE2.assigned_to 
GROUP BY userid;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...