【问题标题】:SQL - create a view of multiple tables joined togetherSQL - 创建连接在一起的多个表的视图
【发布时间】:2013-06-08 15:31:27
【问题描述】:

我需要创建多个表的视图,这些表连接到名为artists 的表,以便可以轻松引用它。

视图中数据的排列是我正在努力解决的问题。我需要连接的行为彼此独立,因此不会重复数据。我将给出到目前为止的查询,然后给出一些示例;

CREATE VIEW stream_view AS
SELECT
A.ID,
T.T_ID,
T.name AS name,
T.pic AS T_pic,
T.timestamp AS T_ts,
(SELECT COUNT(*) FROM track_plays WHERE T_ID = T.T_ID) AS plays,
(SELECT COUNT(*) FROM track_downloads WHERE T.T_ID) AS downloads,
(SELECT COUNT(*) FROM likes WHERE E_ID = T.ID AND event = 'T') AS T_likes,
S.S_ID,
S.status,
S.timestamp AS S_ts,
(SELECT COUNT(*) FROM likes WHERE E_ID = S.ID AND event = 'S') AS S_likes,
G.G_ID,                                                
G.gig_name,
G.date_time,
G.lineup,
G.price, 
G.currency,
G.pic AS G_pic,
G.ticket,
G.venue,
G.timestamp AS G_ts,
(SELECT COUNT(*) FROM likes WHERE E_ID = G.ID AND event = 'G') AS G_likes

FROM artists A
LEFT JOIN status S 
ON S.ID = A.ID
LEFT JOIN gigs G ON G.ID = A.ID
LEFT JOIN tracks T ON T.ID = A.ID

我会举一些例子,但为了简单起见,只包括所有东西的 ID。

应该发生的事情示例

假设我有两个 3 A.ID,分别是 1、2 和 3。每个 ID 都有几个 G_IDT_IDS_ID 属于它们。视图应该出现,因此没有重复,并且每个 G_IDT_IDS_ID 位于不同的行并分配给它们的 A_ID。像这样的东西;

 A_ID    G_ID    T_ID    S_ID

 1       1       NULL    NULL
 1       NULL    4       NULL
 2       NULL    NULL    5
 3       2       NULL    NULL
 3       NULL    8       NULL
 3       NULL    NULL    8

目前发生的情况示例

 A_ID    G_ID    T_ID    S_ID

 1       1       NULL    NULL
 1       1       4       NULL
 2       NULL    NULL    5
 3       2       NULL    NULL
 3       2       8       NULL
 3       2       8       8

如您所见,数据是重复的,因此该表包含多个相同的G_IDT_IDS_ID。这些 ID 在各自的列中是唯一的,因此它们不能与 G_ID 重复,但例如 G_IDT_ID 可以具有相同的值。

【问题讨论】:

  • @marc_s 抱歉,忘记添加了。
  • JFYI:您的数据库称为 mysql,而不是 mysqli
  • 这似乎与 Stop duplication of data in left join 重复 - 提供的至少一个答案应返回请求的输出。

标签: mysql sql


【解决方案1】:

现在,您正在将这些行连接在一起。看来您需要 union all 查询。

这是基于您提供的示例数据的结构:

select a.*, t.*
from ((select a_id, g_id, null as t_id, null as s_id
       from gigs g
      ) union all
      (select a_id, null as g_id, t_id, null as s_id
       from tracks t
      ) union all
      (select a_id, null as g_id, null as t_id, s_id
       from status s
      )
     ) t join
     artists a
     on t.a_id = a.a_id

【讨论】:

  • 如果每个表中的列数相同,则联合将起作用,但正如您从我的查询中看到的那样,目前它们不是。
猜你喜欢
  • 2016-07-23
  • 2015-11-09
  • 2019-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多