mysql复杂从多个表中选择查询

时间:2013-02-26 22:46:47

标签: database database-design relational-database

表格访问;

字段[ID,patient_id(FK),doctor_id(FK),标志(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:我应该考虑使用join而不是选择多个表吗? 如果我应该为什么?

这个查询的执行时间是0.0009所以我觉得很好,因为我在一个查询中获取了所有数据,或者这是不好的做法?

2:在我想说的选择部分

如果v.type!= 0 select f.name,f.color别的我不想选择那些表格flags f 有可能吗?

目前还没有找到flag,它会复制所有行,就像标志表中的行一样多!有什么方法可以防止这种情况吗?两者都是 flag和visit_types表?

1 个答案:

答案 0 :(得分:1)

  1. 如果它运行得很快,我就不会搞砸了。我通常更喜欢使用连接而不是匹配where子句中的东西。

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

  3. 查看MySQL的案例陈述:http://dev.mysql.com/doc/refman/5.0/en/case.html

  4. 
    select case when v.type <> 0 then 
       f.name 
    else 
       '' 
    end as name, ...