私は書いた複雑なクエリを持っていますが、最初から私が望むすべてのデータを取得しました。今私は、私が今持っているものとは少し異なる、一つのフィールドの値を必要とすることを理解しています。他のフィールドが1である限り、Mysqlは1つのフィールドの最小値を取得します
私がしている: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
任意の助けが理解されるであろう。
これはとても単純で論理的で、私はそれを考えることができませんでした。あなたは華麗です。 – Nightwolf
ようこそ。 –