【问题标题】:Problemt with mysql joinmysql连接的问题
【发布时间】:2014-12-20 11:19:05
【问题描述】:

我对下面显示的查询有疑问。它总是为快照和 adm 返回相同的值。而且返回的值也不是我所期望的。

SELECT 
domains.name, count(snapshot_info.snapshot_uuid) as snapshot, count(users_domains.uuuid) as adm
FROM 
domains, snapshot_info, users_domains
WHERE 
domains.duuid = snapshot_info.duuid 
AND 
users_domains.duuid = domains.duuid 
group by name;

返回:

domain1 33 33
domain2 40 40
domain3 3  3

此查询有效并返回正确的值

SELECT 
domains.name, count(snapshot_info.snapshot_uuid) as snapshot
FROM 
domains, snapshot_info
WHERE 
domains.duuid = snapshot_info.duuid 
group by name;

返回

domain1 3
domain2 20
domain3 17

所以,如您所见,问题是在我添加 users_domains 加入时引入的。

有什么建议吗?

【问题讨论】:

  • 拥有每个表的样本数据集和通用表结构会很有用。当我们不知道结构是什么样子以及预期结果应该是什么时,调试 SQL 有点困难。
  • 您是否尝试过只运行查询的第二个参数?比如加入snapshot_info到user_domains

标签: mysql sql left-join mariadb jointable


【解决方案1】:

在第一个查询中,您正在domains, snapshot_info, users_domains 之间进行交叉连接。

如果第二个查询适合您,可能您在 domainsusers_domains 之间重复行,因此您需要另一个字段来连接这些表以不重复,因为连接 users_domains.duuid = domains.duuid 不足.

但是,试试这个:

SELECT 
     domains.name,
     count(distinct snapshot_info.snapshot_uuid) as snapshot,
     count(distinct users_domains.uuuid) as adm
FROM 
     users_domains
     LEFT OUTER JOIN 
     domains 
     ON users_domains.duuid = domains.duuid 
     LEFT OUTER JOIN
     snapshot_info
     ON domains.duuid = snapshot_info.duuid 
group by name;

【讨论】:

  • 谢谢!此查询是正确的,只是它返回的值与我的原始查询相同。问题是缺少“不同”。请参阅下面接受的答案。
  • 好的,如果你只想要不同的值,你是对的。感谢感谢
【解决方案2】:

最好使用这种语法(见这个问题:INNER JOIN vs WHERE clause):

SELECT 
  domains.name,
  count(DISTINCT snapshot_info.snapshot_uuid) as snapshot,
  count(DISTINCT users_domains.uuuid) as adm
FROM 
  domains INNER JOIN snapshot_info
  ON domains.duuid = snapshot_info.duuid
  INNER JOIN users_domains
  ON users_domains.duuid = domains.duuid 
GROUP BY
  name;

注意在这种情况下您应该使用COUNT(DISTINCT ...)

【讨论】:

  • 谢谢。问题是我的查询中缺少“distinct”。
猜你喜欢
  • 1970-01-01
  • 2010-09-23
  • 2011-02-16
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
  • 2011-05-17
相关资源
最近更新 更多