如果连接表中存在条目,如何显示字段?

时间:2015-06-13 03:02:56

标签: sql postgresql postgresql-9.2

我正在编写一个显示来自issues表的数据的查询。我们有另一个名为labels的表和一个名为issues_labels的连接表。我们通常会为问题分配“高优先级”,“中优先级”或“低优先级”标签。

我不确定如何编写查询以便返回此结果:

Id         | Title                  | Priority
2            everything is broken     Low-Priority
4            internets is down        High-Priority

我一直在写查询,但这个简单(或不简单)让我疯狂。我是否需要编写3个子查询来提取链接到每个标签的问题:

with hp_issues as (
SELECT *
FROM issues
INNER JOIN issues_labels on issues_labels.issue_id = issue.id
WHERE issues_labels.label_id = 10 --id for high priority issue
)
....

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:2)

假设issues_labels是一个在多对多情况下连接问题和标签的表,您可以这样做:

select
  i.id,
  i.title,
  l.priority
from issues i
left join issues_labels il on il.issues_id = i.id
left join labels l on l.id = il.labels_id

示例:http://sqlfiddle.com/#!15/b78ee/1

出于任何原因,如果您的某个问题具有多个优先级,并且您希望将其发布为

5 | Some title | High Priority, Low Priority

你可以这样做:

select
  i.id,
  i.title,
  string_agg(l.priority, ',')
from issues i
left join issues_labels il on il.issues_id = i.id
left join labels l on l.id = il.labels_id
group by
  i.id,
  i.title

这类似于MySQL的group_concat()

示例如下:http://sqlfiddle.com/#!15/3dce4/2

答案 1 :(得分:0)

问题只能有一个标签吗?如果是这样,我认为不需要多对多。

但是,您应该可以执行以下操作:

SELECT i.issueID, i.title, l.priority
FROM issue AS i
    LEFT JOIN issue_label as il on i.issueID = il.issueID
    LEFT JOIN label as l on l.labelID = il.labelID
WHERE issue_label = 10;