Будут ли условия на странно соединенной таблице работать так, как ожидалось? - PullRequest
0 голосов
/ 31 августа 2011

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

Например, если я добавлю дополнительное условие в нижней части моего запроса:

SELECT  c.*, p.*
FROM    clients AS c
JOIN    programs AS p
ON      p.id = 
        (
        SELECT  pi.id
        FROM    programs AS pi
        WHERE   pi.client_id = c.id
        ORDER BY
                pi.close_date=0 DESC, pi.close_date DESC
        LIMIT 1
        )
WHERE p.somefield='somevalue'

Допустим, у клиента есть 2 активные программы, 1 для которых p.somefield='somevalue' имеет значение true,другой, для которого он ложный, однако, ложный - тот, который был выбран для объединения (у него более поздняя дата закрытия) ... тогда этот клиент вообще не будет выбран, или он просто выберет другого(реже закрытая) программа для него?

1 Ответ

2 голосов
/ 31 августа 2011

Вы бы просто добавили проверку p.somefield в подзапрос, чтобы избежать этого.

SELECT  c.*, p.*
FROM    clients AS c
JOIN    programs AS p
ON      p.id = 
        (
        SELECT  pi.id
        FROM    programs AS pi
        WHERE   pi.client_id = c.id
          AND   pi.somefield='somevalue'
        ORDER BY
                pi.close_date=0 DESC, pi.close_date DESC
        LIMIT 1
        )

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

...