如何加入以下两个 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/