我有一个我编写的复杂查询,它最初会从中检索我想要的所有数据。现在我意识到我需要一个领域的价值与我现在拥有的价值略有不同。
我有:IF(MIN(tasks.due_date) < NOW(),1,0) AS taskoverdue,我希望拥有它:
IF(MIN(tasks.due_date WHERE tasks.completed != 1) < NOW(),1,0) AS taskoverdue
我知道这个语法不起作用,是否有任何人可以想到的操作会实现这个结果?
由于我的查询很复杂,我不能修改where子句或group by子句,并且我不能在select子句中运行子查询,而不会显着地破坏应用程序的速度。哦,我正在使用PHP,但我正在寻找一个MySQL解决方案。
这里是我的完整查询只是踢:
SELECT
tickets.id,
tickets.user_id,
tickets.name,
COUNT(DISTINCT tasks.id) AS numTasks,
IF(MIN(tasks.due_date) < NOW(),1,0) AS taskoverdue,
IF(tickets.due_date < NOW(),1,0) AS ticketoverdue,
tasks.queue_id AS queue_id ,
IF(MIN(tasksteps.time_due) < NOW(),1,0) AS taskstepoverdue,
COUNT(DISTINCT ticketnotes.ticket_id) as notes
FROM
tickets
LEFT OUTER JOIN ticketsinqueues ON tickets.id = ticketsinqueues.ticket_id
LEFT OUTER JOIN tasks ON tickets.id = tasks.ticket_id
LEFT OUTER JOIN tasksteps ON tasks.id = tasksteps.task_id
LEFT OUTER JOIN ticketnotes ON tickets.id = ticketnotes.ticket_id
WHERE
ticketsinqueues.queue_id != tasks.queue_id AND
tickets.status = (var decided on run time)
GROUP BY
tickets.id,tasks.queue_id
UNION
SELECT
tickets.id,
tickets.user_id,
tickets.name,
COUNT(DISTINCT tasks.id) AS numTasks,
IF(MIN(tasks.due_date) < NOW(),1,0) AS taskoverdue,
IF(tickets.due_date < NOW(),1,0) AS ticketoverdue,
tasks.queue_id AS queue_id ,
IF(MIN(tasksteps.time_due) < NOW(),1,0) AS taskstepoverdue,
COUNT(DISTINCT ticketnotes.ticket_id) as notes
FROM
tickets
LEFT OUTER JOIN ticketsinqueues ON tickets.id = ticketsinqueues.ticket_id
LEFT OUTER JOIN tasks ON tickets.id = tasks.ticket_id
LEFT OUTER JOIN tasksteps ON tasks.id = tasksteps.task_id
LEFT OUTER JOIN ticketnotes ON tickets.id = ticketnotes.ticket_id
WHERE
ticketsinqueues.queue_id = tasks.queue_id AND
tickets.status = (var decided on run time)
GROUP BY
tickets.id,tasks.queue_id
UNION
SELECT
tickets.id,
tickets.user_id,
tickets.name,
0 AS numTasks,
0 AS taskoverdue,
IF(tickets.due_date < NOW(),1,0) AS ticketoverdue,
ticketsinqueues.queue_id AS queue_id ,
0 AS taskstepoverdue,
0 AS notes
FROM
tickets
LEFT OUTER JOIN ticketsinqueues ON tickets.id = ticketsinqueues.ticket_id
WHERE
tickets.status = (var decided on run time) AND
NOT EXISTS (
SELECT
*
FROM
tasks
WHERE
tickets.id = tasks.ticket_id AND
tickets.queue_id = tasks.queue_id
GROUP BY
tasks.ticket_id,
tasks.queue_id)
ORDER BY id desc任何帮助将不胜感激。