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_book这样source_ref

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

并且sources会变成一个两表连接:

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 回答
0

我不完全了解源中的 sub_id 是什么以及它如何链接到 source_books

sql几乎看起来像这样

select m.id,ms.synonym,su.url from muscles m
join muscle_synonym ms on ms.id=m.primary_synonym_id
join sources s on s.id=m.source
join source_url su on s.sub_id=su.id
于 2013-10-08T22:44:14.277 回答