rub*_*ots 5 mysql sql subquery
这个似乎是一个简单的问题,但我不能使它在单个选择或嵌套选择中工作.将论文(文章)的作者和(如果有的话)顾问检索到一行.
我为了解释这个问题,这里有两个数据表(伪)
papers (id, title, c_year)
persons (id, firstname, lastname)
Run Code Online (Sandbox Code Playgroud)
加上一个带有一个额外属性(伪)的链接表:
paper_person_roles(
paper_id
person_id
act_role ENUM ('AUTHOR', 'ADVISER')
)
Run Code Online (Sandbox Code Playgroud)
这基本上是一份书面文件清单(表格:文件)和工作人员和/或学生名单(表格:人员)
我有一篇文章(1,N)作者.
一篇文章可能有(0,N)顾问.
一个人可以是"AUTHOR"或"ADVISER"角色(但不能同时).
应用程序最终会输出包含以下条目的表行:
TH: || Paper_ID | Author(s) | Title | Adviser(s) | TD: || 21334 |John Doe, Jeff Tucker|Why the moon looks yellow|Brown, Rayleigh| ...
我的第一种方法是:
在应用程序中选择/提取完整的文章列表,例如.
SELECT
q.id, q.title
FROM
papers AS q
ORDER BY
q.c_year
Run Code Online (Sandbox Code Playgroud)
并将查询结果保存到数组中(在应用程序中).在此步骤之后,循环返回的信息数组并通过链接表中的预准备语句(?是纸张的id)检索作者和顾问(如果有),如:APPLICATION_LOOP(paper_ids in array)
SELECT
p.lastname, p.firstname, r.act_role
FROM
persons AS p, paper_person_roles AS r
WHERE
p.id=r.person_id AND r.paper_id = ?
# The application does further processing from here (pseudo):
foreach record from resulting records
if record.act_role eq 'AUTHOR' then join to author_column
if record.act_role eq 'ADVISER' then join to avdiser_column
end
print id, author_column, title, adviser_column
APPLICATION_LOOP
Run Code Online (Sandbox Code Playgroud)
这到目前为止工作并提供所需的输出.将计算重新放入数据库是否有意义?
我不是非常精通非平凡的SQL,也无法找到单个(组合或嵌套)选择调用的解决方案.我试过了...... 喜欢
SELECT
q.title
(CONCAT_WS(' ',
(SELECT p.firstname, p.lastname AS aunames
FROM persons AS p, paper_person_roles AS r
WHERE q.id=r.paper_id AND r.act_role='AUTHOR')
)
) AS aulist
FROM
papers AS q, persons AS p, paper_person_roles AS r
Run Code Online (Sandbox Code Playgroud)
在几个变化,但没有运气......
也许有机会?
提前致谢
RB
以下查询适用于我的测试数据,请尝试一下。
要获取每篇论文的作者/顾问列表,需要两个子查询。
Select
p.id,
p.title,
p_aut.aut_name,
p_adv.adv_name
From papers p
Left Join (
Select pp_aut.paper_id,
Group_Concat(Concat(p_aut.firstname, ' ', p_aut.lastname)) aut_name
From paper_person_roles pp_aut
Join persons p_aut On (p_aut.id = pp_aut.person_id)
Where pp_aut.act_role='AUTHOR'
Group By pp_aut.paper_id
) p_aut On ( p_aut.paper_id = p.id )
Left Join (
Select pp_adv.paper_id,
Group_Concat(Concat(p_adv.firstname, ' ', p_adv.lastname)) adv_name
From paper_person_roles pp_adv
Join persons p_adv On (p_adv.id = pp_adv.person_id)
Where pp_adv.act_role='ADVISER'
Group By pp_adv.paper_id
) p_adv On ( p_adv.paper_id = p.id )
Group By p.id, p.title
Run Code Online (Sandbox Code Playgroud)