mysql - SQL 如何将这三个 View 合并为一个?

标签 mysql sql

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

View 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; 

View 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 

View 3(此 View 将 View 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

这是我的原始 View ,但无法正常工作。这些值会重复。

原始 - splinter View SELECT e.id, e.name, GROUP_CONCAT(email SEPARATOR ',') 作为电子邮件, GROUP_CONCAT(web_site SEPARATOR ',') AS web_sites FROM 实体 AS e 在 e.id=emails.entity_id 上左加入电子邮件 在 e.id=web_sites.entity_id 上左加入 web_sites 按 id 分组;

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

编辑 #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 

最佳答案

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 ; 

如果你使用 View ,你不需要最后一个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 ; 

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

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 ;

关于mysql - SQL 如何将这三个 View 合并为一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19469652/

相关文章:

php - string(49) "select * from php mysql 错误

php - 如何优化mysql查询注册

mysql - HAVING 查询的问题

php - 无法让 mysql_insert_id() 工作

sql - 可以在数据库级别强制执行 "auto_increment"上的 "sub_groups"吗?

php - 如何减少循环时间

php - 向mysql数据库插入多行

MySQL优化简单数据库

php - Laravel 4 不返回一对多

mysql - 使用shell命令将MySQL数据库远程备份到本地机器