0

テーブル訪問;

fields [id、patient_id(fk)、doctor_id(fk)、flag(Xfk)、type(Xfk)、time_booked、date、...]

Xfk =他のテーブルを参照しますが、存在する必要はないので、constraintは使用しません。

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つの大きな統計!私の質問は、

1:複数のテーブルを選択する代わりに結合の使用を検討する必要がありますか?そして、私がなぜそうすべきか?

このクエリの実行時間は0.0009なので、問題ないと思います。すべてのデータを1つのクエリで取得するので、それとも悪い習慣ですか。

2:選択した部分で言いたい

v.type!= 0の場合、それ以外の場合は、select f.name,f.colorテーブルを選択する必要はありflags f ませんか?

また、現在、フラグが見つからなかった場合は、フラグテーブルの行と同じ数のすべての行が複製されます。これを防ぐ方法はありますか?flagとvisit_typesテーブルの両方?

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 に答える