0

次のようなテーブルがあります。

筋肉

id          primary_synonym_id  source
----------  ------------------  ----------
1           1                   1
2           2                   2
3           3                   3

筋肉の同義語

id          synonym        
----------  ---------------
1           Gluteus maximus
2           Soleus
3           Infraspinatus

ソース (おそらくおわかりのようにsources、リンク テーブルとして意図されています。)

id          type        sub_id
----------  ----------  ----------
1           url         1
2           url         2
3           book        1

source_urls

id          url
----------  ------------------
1           http://v.gd/3NCOMC
2           http://v.gd/fWdonY

source_books

id          isbn
----------  ----------
1           1405006692

上記から、次の出力を生成するためにどのクエリをお勧めしますか?

id          synonym          ref
----------  ---------------  ------------------
1           Gluteus maximus  http://v.gd/3NCOMC
2           Soleus           http://v.gd/fWdonY         
3           Infraspinatus    1405006692

そのようなクエリに代わる価値のある代替案がある場合は、言及してください。これは、優れたデータベース プラクティスを促進すると思われます。(たとえば、データを構造化する別の方法と、より単純なクエリの使用。)

4

3 に答える 3

2

機能に不慣れでしたcoalesce()次のクエリは、これに触発されたものであり、機能します。

select muscles.id, synonym, coalesce(url, isbn) as ref
from muscles
join muscle_synonyms on muscles.primary_synonym_id = muscle_synonyms.id
join sources on muscles.source = sources.id
left join source_urls on
    sources.type = 'url' and
    sources.sub_id = source_urls.id
left join source_books on
    sources.type = 'book' and
    sources.sub_id = source_books.id
where ref not null;
于 2013-10-08T23:32:49.347 に答える
0

に 2 つの異なるテーブルを使用する利点は見当たりませんsource_*

私はマージsource_urlsource_booksource_refそうします:

id          type        ref
----------  ----------  ------------------
1           url         http://v.gd/3NCOMC
2           url         http://v.gd/fWdonY
3           book        1405006692

そしてsources、2 つのテーブル結合になります。

id          ref_id
----------  ----------
1           1
2           2
3           3

したがって、クエリは次のような単純な結合になります。

SELECT muscles.id, muscle_synonyms.synonym, source_ref.ref FROM muscles
LEFT JOIN muscle_synonyms ON muscles.id=muscle_synonyms.id
LEFT JOIN source ON muscles.source=source.id
LEFT JOIN source_ref ON source.ref_id=source_ref.id;

synonymこれには、ソースもソースの参照もないものも含め、すべてのマッスルが含まれます。

于 2013-10-09T09:25:34.457 に答える