0

餐桌访问;

字段[id,patient_id(fk),doctor_id(fk),flag(Xfk),type(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 != 0select f.name,f.color否则我不想在任何表格flags f 中选择它们,这可能吗?

目前,如果未找到标志,它会复制所有行,就像标志表在行中的一样多!有什么办法可以防止这种情况吗?标志和访问类型表?

4

1 回答 1

1
  1. 如果它运行得很快,我就不会惹它。我通常更喜欢在 where 子句中使用连接而不是匹配内容。

  2. 你有没有机会删除 ` 字符?在我看来,只是让阅读变得有点困难。

  3. 查看 MySQL 的 case 语句:http: //dev.mysql.com/doc/refman/5.0/en/case.html


select case when v.type <> 0 then 
   f.name 
else 
   '' 
end as name, ...
于 2013-02-28T21:53:23.267 回答