Есть ли способ объединить несколько разных запросов (почти идентичных) в один? - PullRequest
1 голос
/ 14 сентября 2009

У меня есть около 4 или 5 различных запросов, все они точно такие же, за исключением того, что содержится в предложении WHERE. Например, это отчеты, которые работают по дате, поэтому в одном отчете используется дата Now (), а в других отчетах - по месяцам и 15 дням. Все поля одинаковы. Есть ли способ объединить их в один запрос и просто изменить данные в предложении WHERE на лету? Или какое-то другое решение ??

Спасибо


ОК Ребята, спасибо за ответы. Вот актуальные запросы. Пожалуйста, обратите внимание, что предложение where - единственное, что отличается, и я действительно ненавижу писать другой запрос, который почти точно похож, когда мне нужно добавить новый отчет.

SELECT t1.customer_id, t1.name, t2.dtime, t6.band_type, t7.dop, t5.lun, t2.rpt
FROM
customer AS t1
Inner Join report AS t2 ON t1.customer_id = t2.customer_id
Inner Join employee AS t5 ON t5.employee_id = t2.employee_id
Inner Join band_type AS t6 ON t6.band_type_id = t2.band_type_id
Inner Join dop AS t7 ON t7.dop_id = t2.dop_id
WHERE
t2.rpt_type = 'daily' AND
t2.tmstamp >= date_sub(curdate(), interval 1 month) AND
t2.tmstamp <= curdate() AND
t1.customer_id = ''



WHERE
t2.tmstamp >= '$date 00:00:00' AND
t2.tmstamp <= '$date 23:59:59' AND
t1.customer_id = '' AND
t2.deleted =  '0'


WHERE
t2.stamp >= date_sub(now(), interval 1 day) AND
t1.customer_id = '' AND
t2.band_type = '' AND
t2.deleted = '0'

Ответы [ 3 ]

0 голосов
/ 14 сентября 2009

см. здесь

У вас есть 2 варианта, построить динамический SQL или использовать параметр coalesce.

Я предпочитаю позже (прокрутите полпути вниз по ссылке "Coalesce function"

Имейте в виду, что оба варианта имеют свои сильные и слабые стороны

0 голосов
/ 14 сентября 2009

Возможно, вы захотите создать представление.

0 голосов
/ 14 сентября 2009

Используйте OR или UNION ALL:

SELECT  *
FROM    mytable
WHERE   date = NOW() OR date = NOW() - INTERVAL 1 DAY

SELECT  *
FROM    mytable
WHERE   date = NOW()
UNION ALL
SELECT  *
FROM    mytable
WHERE   date = NOW() - INTERVAL 1 DAY

Обновление:

Если вам нужны три набора результатов, вам понадобятся три запроса, а если у вас три запроса, у вас будет три SELECT списка.

Вы можете составлять свои запросы в приложении (вы создаете список SELECT один раз и просто добавляете условие WHERE).

Кроме того, вы можете получить все в одном запросе и проанализировать результаты на клиенте:

SELECT 1 AS resultset,
       t1.customer_id, t1.name, t2.dtime, t6.band_type, t7.dop, t5.lun, t2.rpt
FROM
customer AS t1
Inner Join report AS t2 ON t1.customer_id = t2.customer_id
Inner Join employee AS t5 ON t5.employee_id = t2.employee_id
Inner Join band_type AS t6 ON t6.band_type_id = t2.band_type_id
Inner Join dop AS t7 ON t7.dop_id = t2.dop_id
WHERE
t2.rpt_type = 'daily' AND
t2.tmstamp >= date_sub(curdate(), interval 1 month) AND
t2.tmstamp <= curdate() AND
t1.customer_id = ''
UNION ALL
SELECT 2 AS resultset,
       t1.customer_id, t1.name, t2.dtime, t6.band_type, t7.dop, t5.lun, t2.rpt
FROM
customer AS t1
Inner Join report AS t2 ON t1.customer_id = t2.customer_id
Inner Join employee AS t5 ON t5.employee_id = t2.employee_id
Inner Join band_type AS t6 ON t6.band_type_id = t2.band_type_id
Inner Join dop AS t7 ON t7.dop_id = t2.dop_id
WHERE
t2.tmstamp >= '$date 00:00:00' AND
t2.tmstamp <= '$date 23:59:59' AND
t1.customer_id = '' AND
t2.deleted =  '0'
SELECT 3 AS resultset,
       t1.customer_id, t1.name, t2.dtime, t6.band_type, t7.dop, t5.lun, t2.rpt
FROM
customer AS t1
Inner Join report AS t2 ON t1.customer_id = t2.customer_id
Inner Join employee AS t5 ON t5.employee_id = t2.employee_id
Inner Join band_type AS t6 ON t6.band_type_id = t2.band_type_id
Inner Join dop AS t7 ON t7.dop_id = t2.dop_id
WHERE
t2.stamp >= date_sub(now(), interval 1 day) AND
t1.customer_id = '' AND
t2.band_type = '' AND
t2.deleted = '0'

Здесь все 3 наборов результатов возвращаются как один набор результатов с дополнительным полем (resultset), которое позволяет различать их.

Конечно, вы также можете создать вид, подобный этому:

CREATE VIEW v_customers AS
SELECT t1.customer_id, t1.name, t2.dtime, t6.band_type, t7.dop, t5.lun, t2.rpt
FROM
customer AS t1
Inner Join report AS t2 ON t1.customer_id = t2.customer_id
Inner Join employee AS t5 ON t5.employee_id = t2.employee_id
Inner Join band_type AS t6 ON t6.band_type_id = t2.band_type_id
Inner Join dop AS t7 ON t7.dop_id = t2.dop_id


SELECT *
FROM   v_customers
WHERE
t2.rpt_type = 'daily' AND
t2.tmstamp >= date_sub(curdate(), interval 1 month) AND
t2.tmstamp <= curdate() AND
t1.customer_id = ''

и т. Д., Но вам все равно потребуется скопировать список выбора.

P. S. Что именно вы хотите оптимизировать? Компьютеры в наше время очень хороши в копировании строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...