2011-08-03 8 views
1

私は書いた複雑なクエリを持っていますが、最初から私が望むすべてのデータを取得しました。今私は、私が今持っているものとは少し異なる、一つのフィールドの値を必要とすることを理解しています。他のフィールドが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 

任意の助けが理解されるであろう。

答えて

2
MAX(tasks.completed != 1 AND tasks.due_date < NOW()) AS taskoverdue 
+0

これはとても単純で論理的で、私はそれを考えることができませんでした。あなたは華麗です。 – Nightwolf

+0

ようこそ。 –

関連する問題