mysql - 没有笛卡尔积的单个 mysql 查询中的多个多对多 JOIN

标签 mysql join many-to-many cartesian-product

目前我可以通过两个单独的 SELECT 语句获得我需要的结果

SELECT 
COUNT(rl.refBiblioID) 
FROM biblioList bl 
LEFT JOIN refList rl ON bl.biblioID =  rl.biblioID 
GROUP BY bl.biblioID

SELECT
GROUP_CONCAT(
CONCAT_WS( ':', al.lastName, al.firstName )
ORDER BY al.authorID ) 
FROM biblioList bl 
LEFT JOIN biblio_author ba ON ba.biblioID = bl.biblioID
JOIN authorList al ON al.authorID = ba.authorID 
GROUP BY bl.biblioID

但是像这样组合它们

SELECT
GROUP_CONCAT(
CONCAT_WS( ':', al.lastName, al.firstName )
ORDER BY al.authorID ),
COUNT(rl.refBiblioID) 
FROM biblioList bl 
LEFT JOIN biblio_author ba ON ba.biblioID = bl.biblioID
JOIN authorList al ON al.authorID = ba.authorID 
LEFT JOIN refList rl ON bl.biblioID =  rl.biblioID
GROUP BY bl.biblioID

导致作者结果列有重名。如何在不使用 DISTINCT 的情况下从一个 SELECT 语句中获得所需的结果?使用子查询?

最佳答案

如果可以接受子选择,我相信您可以通过执行以下操作来实现:

SELECT
  y.authors,
  COUNT(rl.refBiblioID) 
FROM
  (SELECT
    bl.biblioId,
    GROUP_CONCAT(
      CONCAT_WS(':', al.lastName, al.firstName)
      ORDER BY al.authorID) AS authors
  FROM biblioList bl
  LEFT JOIN biblio_author ba ON ba.biblioID = bl.biblioID
  JOIN authorList al ON al.authorID = ba.authorID 
  GROUP BY bl.biblioID) y
LEFT JOIN refList rl ON (y.biblioID =  rl.biblioID)
GROUP BY y.biblioID

另一种解决方案是将 DISTINCT 添加到您的 GROUP_CONCAT,但这不是您想要的?

GROUP_CONCAT(
  DISTINCT(CONCAT_WS(':', al.lastName, al.firstName) ORDER BY al.authorID)),

关于mysql - 没有笛卡尔积的单个 mysql 查询中的多个多对多 JOIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3042832/

相关文章:

c# - 是否可以在 Visual Studio 项目中使用 linq 语法使用 Mysql?

PostgreSQL 加入表之间的最新记录

c# - 如何通过实体键添加/删除与 Entity Framework 的多对多关系?

Symfony2.存储库方法不返回多对多的额外字段(外键)

mysql - SQL:删除具有重复字段的行

MYSQL like查询在explain中不显示全表扫描

MySQL:JOIN 查询获取所有具有可为空字段的项目

MySQL查询构造

php - 拉拉维尔 5.6 : Many-to-many relationship returns empty object

sockets -/etc/init.d 中缺少 mysqld.sock 和 mysqld