【问题标题】:join sql query to analyze values加入 sql 查询以分析值
【发布时间】:2011-09-21 21:07:04
【问题描述】:

我有一张表 entries,其中包含三列:id, name, display_name
我需要编写一个带有连接的查询,它将检查每个名称有多少个 display_name,并只显示那些具有多个 display_name 的名称。
使用连接编写这应该相当简单。在我使用下一个查询之前:

SELECT e1.name 
FROM entries e1 
WHERE (
  SELECT COUNT(DISTINCT e2.display_name) 
  FROM entries e2 
  WHERE e2.name = r1.name
) > 1;

【问题讨论】:

  • 如果您的查询满足您的需求,那么问题是什么?
  • 问题是:用join怎么写?

标签: sql join


【解决方案1】:

您不需要加入。

SELECT e1.name 
FROM entries e1 
GROUP BY e1.name
HAVING COUNT(*) > 1

请注意,您可以在 having 子句中使用别名,因此您也可以借用 @Scorpi0 和 @Widor:

SELECT e1.name, COUNT(DISTINCT e1.display_name) as occurrences
FROM entries e1 
GROUP BY e1.name
HAVING occurrences > 1

允许这样做的原因是 having 在选择中的所有其他内容完成后进行评估。到那时,别名的内容就会知道了。
您不能在WHERE 子句中使用此别名,因为它运行(或可能运行)之前 MySQL 知道别名中的内容。

【讨论】:

  • 感谢 group byhaving 线索。
【解决方案2】:

你不需要加入,HAVING 子句可以为你做过滤:

SELECT e1.name 
FROM entries e1 
GROUP BY e1.name
HAVING COUNT(DISTINCT e1.display_name) > 1

【讨论】:

    【解决方案3】:
    SELECT name, COUNT(display_name)
    FROM entries
    GROUP BY name
    HAVING COUNT(display_name) > 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多