我有如下表格:
肌肉
id primary_synonym_id source
---------- ------------------ ----------
1 1 1
2 2 2
3 3 3
muscle_synonyms
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
请提及有价值的替代方案 - 如果有的话 - 对于这样的查询,您认为会促进良好的数据库实践。 (例如,构造数据和使用更简单查询的不同方法。)
答案 0 :(得分:2)
我不熟悉coalesce()
功能。以下查询的灵感来自this,并且有效:
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;
答案 1 :(得分: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
答案 2 :(得分:0)
对于source_*
有两个不同的表,我看不出任何优势。
我会将source_url
和source_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
来源的肌肉,也没有任何参考资料。