0

以下で説明するように、5 つの mysql テーブルがあります。診療所のテーブル

id
name

d_location_subscription テーブル

id
clinic_id
t_id   //t_id will contain a foreign key of d_cities, d_states or d_countries table
type   "country" "state" "city"

d_countries テーブル

id
name
code

d_states テーブル

id
d_country_id
name
code

d_city テーブル

id
d_state_id
name
code

d_location_subscription テーブルは、場所 (都市、州、または国) に対するクリニックのサブスクリプションを記録するために使用されます。d_location_subscription テーブルを使用して、特定の診療所に登録されているすべての都市を取得することを期待しています。

たとえば、診療所 A がテキサス州に加入している場合、診療所 A のすべての都市 ID を取得できるはずです。

次のSQLクエリを作成しました。見た目は醜いですが、達成したい近い結果を生成します。

select 
    `d`.`id` AS `clinic_id`,
    if((`dct`.`id` is not null),`dct`.`id`,if((`dct1`.`id` is not null),`dct1`.`id`,`dct2`.`id`)) AS `d_city_id` 
from ((((((((
    `d_location_subscriptions` `dls` 
    join `clinics` `d` 
        on((`d`.`id` = `dls`.`clinic_id`))) 
    left join `d_countries` `dc` 
        on(((`dc`.`id` = `dls`.`t_id`) and (`dls`.`type` = 'country')))) 
    left join `d_states` `ds` 
        on((`ds`.`d_country_id` = `dc`.`id`))) 
    left join `d_cities` `dct2` 
        on((`dct2`.`d_state_id` = `ds`.`id`))) 
    left join `d_states` `ds1` 
        on(((`ds1`.`id` = `dls`.`t_id`) and (`dls`.`type` = 'state')))) 
    left join `d_cities` `dct` 
        on((`dct`.`d_state_id` = `ds1`.`id`))) 
    left join `d_cities` `dct1` 
        on(((`dct1`.`id` = `dls`.`t_id`) and (`dls`.`type` = 'city')))) 
) 

d_location_subscription テーブルに「国」タイプのレコードがある場合、次の結果を受け取ります。返されるレコードの総数は、d_states テーブル レコードの数と同じです。

これが結果です

上記のクエリを変更して、これらの Null 値を取り除くにはどうすればよいですか? そして、これが同様の機能を実現する正しい方法であるかどうか、私にアドバイスしてください。前もって感謝します :)

4

2 に答える 2

1

あなたが望むものを達成するための最も迅速で汚い方法は、このwhere条件をクエリに追加することです:

WHERE d_city_id is not null

ただし、クエリを作り直して、INNER 結合ではなく LEFT 結合が本当に必要な場所を決定することをお勧めします。

于 2013-09-16T15:37:18.220 に答える