【问题标题】:SQL How to join these three views into one?SQL 如何将这三个视图合二为一?
【发布时间】:2013-10-19 18:42:31
【问题描述】:

如何加入以下两个视图?我自己尝试过,但它们总是会中断,并显示重复的数据。我能想到的唯一解决方法是创建两个视图,然后创建第三个视图来加入这两个视图。问题是,对于我的应用程序,我将拥有大约 10 个视图,这既不高效也不正确设计。

查看 1

SELECT e.id, e.name, GROUP_CONCAT(email SEPARATOR ', ') AS array_emails
FROM entity AS e
LEFT JOIN emails ON e.id=emails.entity_id
GROUP BY id; 

查看 2

SELECT e.id, e.name, GROUP_CONCAT(web_site SEPARATOR ', ') AS array_web_sites
FROM entity AS e
LEFT JOIN web_sites ON e.id=web_sites.entity_id
GROUP BY id 

视图 3(此视图将视图 1 和 2 连接在一起)

SELECT e.id, e.name, view_web_sites.array_web_sites, view_emails.array_emails
FROM entity AS e
LEFT JOIN view_web_sites ON e.id=view_web_sites.id
LEFT JOIN view_emails ON e.id=view_emails.id
GROUP BY id

这是我原来的观点,不能正常工作。这些值会重复。

原始 - 破损视图 选择 e.id、e.name、GROUP_CONCAT(email SEPARATOR ',') 作为电子邮件, GROUP_CONCAT(web_site SEPARATOR ',') AS web_sites FROM 实体 AS e LEFT JOIN emails ON e.id=emails.entity_id LEFT JOIN web_sites ON e.id=web_sites.entity_id 按 ID 分组;

编辑: 我已经探索了 select 语句中的不同参数,它的效果很好。但是,在一个表中,我有一个二进制列,并且 distinct 参数“擦除”该值,使该列无用。对这个问题有什么建议吗?

编辑 #2(修复): 我设法为可能面临类似问题的任何人解决了这个问题。

SELECT entity.id, entity.name,
(SELECT GROUP_CONCAT(emails.email) FROM emails WHERE entity.id=emails.entity_id) AS emails_array,
(SELECT GROUP_CONCAT(web_sites.web_site) FROM web_sites WHERE
entity.id=web_sites.entity_id) AS websites_array
FROM entity
ORDER BY id 

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    SELECT e.id, 
           e.name, 
           GROUP_CONCAT(DISTINCT m.email SEPARATOR ', ') AS array_emails,
           GROUP_CONCAT(DISTINCT w.web_site SEPARATOR ', ') AS array_web_sites
    FROM entity AS e
      LEFT JOIN emails AS m ON e.id = m.entity_id
      LEFT JOIN web_sites AS w ON e.id = w.entity_id
    GROUP by e.id ; 
    

    如果使用视图,则不需要最后一个GROUP BY id

    SELECT e.id, 
           e.name, 
           m.array_emails,
           w.array_web_sites
    FROM entity AS e
      LEFT JOIN view_emails AS m ON e.id = m.entity_id
      LEFT JOIN view_web_sites AS w ON e.id = w.entity_id ; 
    

    如果您不想要嵌套视图,您可以使用一个查询来编写它 - 并通过删除派生表中的连接来简化它:

    SELECT e.id, 
           e.name, 
           m.array_emails,
           w.array_web_sites
    FROM entity AS e
      LEFT JOIN 
        ( SELECT entity_id, 
                 GROUP_CONCAT(email SEPARATOR ', ') AS array_emails
          FROM emails
          GROUP BY entity_id 
        ) AS m ON e.id = m.entity_id
      LEFT JOIN 
        ( SELECT entity_id, 
                 GROUP_CONCAT(web_site SEPARATOR ', ') AS array_web_sites
          FROM web_sites
          GROUP BY entity_id 
        ) AS w ON e.id = w.entity_id ;
    

    【讨论】:

    • 感谢您的回复,我已经测试了不同的论点。它很好用,但唯一的问题是我在表中有一个具有二进制值的列,当我使用 distinct 时,它会被“擦除”。有什么建议吗?
    • “已擦除”是什么意思?
    • 好吧,假设我在具有二进制值的列中有 4 条记录,记录 1:0 记录 2:0 记录 3:0 记录 4:1 不同的参数以及 GROUP_CONCAT() 转换它变成:0、1。而不是 0、0、0、1(由于不同的 arg。)但问题是当我没有不同的值时,我的输出是 0、0、0、1、0, 0, 0, 1, 0, 0, 0, 1 (循环 3 次,因为我还有其他重复的表)这就是为什么对我有用的唯一解决方案是为每个表创建一个视图,然后加入所有在最终视图中再次将视图组合在一起。
    • 啊,好的。我担心这两个版本可能会因为这样的数据而返回不同的结果。然后,您可以直接使用第二个查询,使用嵌套视图或派生表。
    猜你喜欢
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-19
    • 2018-04-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2016-11-18
    相关资源
    最近更新 更多