2013-02-26 6 views
0

Таблица Посещений;mysql complex select query из нескольких таблиц

поля [идентификатор, patient_id (Ф.К.), doctor_id (Ф.К.), флаг (Xfk), тип (Xfk), time_booked, дата, ...]

Xfk = отнести его к другой таблице, но ее не обязательно существовать, поэтому я не использую ограничение.

SELECT `v`.`date`, `v`.`time_booked`, `v`.`stats`, `p`.`name` as pt_name, 
`d`.`name` as dr_name, `f`.`name` as flag_name, `f`.`color` as flag_color, 
`vt`.`name` as type, `vt`.`color` as type_color 

FROM (`visits` v, `users` p, `users` d, `flags` f, `visit_types` vt) 

WHERE `p`.`id`=`v`.`patient_id` 
AND `d`.`id`=`v`.`doctor_id` 
AND `v`.`flag`=`f`.`id` 
AND `v`.`type`=`vt`.`id` 
AND `v`.`date` >= '2013-02-27' 
AND (v.date <= DATE_ADD('2013-02-27', INTERVAL 7 DAY)) 
AND (`v`.`doctor_id`='00002' OR `v`.`doctor_id`='00001') 
ORDER BY `v`.`date` ASC, `v`.`time_booked` ASC; 

Один большой статуэтка у меня есть! мой вопрос есть,

1: следует ли мне использовать объединение вместо нескольких таблиц? , и если я должен почему?

это время выполнения запроса составляет 0,0009, поэтому я считаю, что это нормально, и поскольку я получаю все свои данные в одном запросе или это плохая практика?

2: в части выбора я хочу сказать

если v.type = 0 select f.name,f.color еще я не хочу, чтобы выбрать их nither там таблицы flags f это возможно!?

также в настоящее время, если флаг не найден, он реплицирует все строки столько, сколько имеет таблица флагов в строках! есть ли способ, которым я могу это предотвратить? как для флага, так и таблицы visit_types?

ответ

1
  1. Если он работает быстро, я бы не стал с ним связываться. Обычно я предпочитаю использовать объединения вместо сопоставления материала в предложении where.

  2. Любой шанс удалить символы? Просто мне кажется, что читать немного по-моему.

  3. Посмотрите на сазе для MySQL: http://dev.mysql.com/doc/refman/5.0/en/case.html


select case when v.type <> 0 then 
    f.name 
else 
    '' 
end as name, ... 
Смежные вопросы