Как мне соединить одну таблицу с другой, где userid = userid, но только на эту дату? - PullRequest
0 голосов
/ 29 июня 2011

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

РЕДАКТИРОВАТЬ: я понял, что это возможно сделать только в нескольких запросах, поэтому я сузил область действия до этого:

SELECT batch_log.userid,
batches.operation_id,
SUM(TIME_TO_SEC(ramses.batch_log.time_elapsed)),
SUM(ramses.tasks.estimated_nonrecurring + ramses.tasks.estimated_recurring),
DATE(start_time)
FROM batch_log
JOIN batches ON batch_log.batch_id=batches.id
JOIN ramses.tasks   ON ramses.batch_log.batch_id=ramses.tasks.batch_id
JOIN protocase.tblusers on ramses.batch_log.userid = protocase.tblusers.userid
WHERE DATE(ramses.batch_log.start_time) > "2011-01-01"
AND protocase.tblusers.active = 1
GROUP BY userid, batches.operation_id, start_time
ORDER BY start_time, userid ASC

Кросс-соединение вызывало проблему.

1 Ответ

1 голос
/ 29 июня 2011

Нет, в общем случае условие Having используется для фильтрации результатов вашего Group by - например, для отчета только о тех, кому заплатили более 24 часов в день (HAVING SUM(ramses.timesheet_detail.paidTime) > 24).Если вам не нужно выполнять фильтрацию агрегированных результатов, вам вообще не понадобится предложение having.
Большинство этих условий следует перенести в предложение where или как часть объединений по двум причинам.- 1) Как правило, фильтрация должна выполняться как можно скорее, чтобы ограничить работу, которую должен выполнить запрос.2) Если фильтрация уже выполнена, ее повторный запуск может привести к тому, что запрос выполнит дополнительную, ненужную работу.
Из того, что я видел до сих пор, кажется, что вы пытаетесь свернуть все по дням - попробуйтеизменив последний столбец в предложении group by на date(ramses.batch_log.start_time), или вы группируете по (что я предполагаю) метке времени.

РЕДАКТИРОВАТЬ:
Об именах схем - да, вы можете назвать их в разделах from и join.Часто запрос также может разрешить необходимые схемы на основе какого-либо списка поиска по умолчанию (как или если это настроено, зависит от вашей базы данных).
Вот как я бы переформатировал запрос:

SELECT tblusers.userid, operations.name AS name,
SUM(TIME_TO_SEC(batch_log.time_elapsed)) AS time_elapsed,
SUM(tasks.estimated_nonrecurring + tasks.estimated_recurring) AS total_estimated,
SUM(timesheet_detail.paidTime) as hours_paid,
DATE(start_time) as date_paid
FROM tblusers
JOIN batch_log 
ON tblusers.userid = batch_log.userid 
AND DATE(batch_log.start_time) >= "2011-01-01" 
JOIN batches 
ON batch_log.batch_id = batches.id
JOIN operations 
ON operations.id = batches.operation_id
JOIN tasks
ON batches.id = tasks.batch_id
JOIN timesheet_detail 
ON tblusers.userid = timesheet_detail.userid 
AND batch_log.start_time = timesheet_detail.for_day
AND DATE(timesheet_detail.for_day) = DATE(start_time)
WHERE tblusers.departmentid = 8
GROUP BY tblusers.userid, name, DATE(batch_log.start_time)     
ORDER BY date_paid ASC 

Особую озабоченность вызывает линия batch_log.start_time = timesheet_detail.for_day, которая сравнивает (что подразумевается под) временные метки.Они действительно равны?Я ожидаю, что один или оба из них должны быть заключены в функцию date().

Что касается того, почему вы можете получать неожиданные данные - вы, похоже, устранили некоторые из ваших условий соединения.Не зная точной настройки и использования вашей базы данных, я не могу назвать точную причину ваших результатов (или даже могу сказать, что они неверны), но я думаю, что тот факт, что вы присоединяетесь к таблице operations без каких-либо joinвозможно, виновато условие - если в этой таблице 2 записи, это удвоит все ваши предыдущие результаты, и похоже, что их может быть 12. Вы также удалили operations.name из предложения group by, что может или можетне дать вам результаты, которые вы хотите.Я бы посмотрел на остальные ваши взаимоотношения за столом и выяснил, есть ли какие-то дополнительные ограничения, которые необходимо сделать.

...