MYSQL UNION DISTINCT

Posted

技术标签:

【中文标题】MYSQL UNION DISTINCT【英文标题】: 【发布时间】:2011-10-21 09:00:06 【问题描述】:

我目前正在以 UNION 的身份成功运行两个选择。

(SELECT a.user_id,
          a.updatecontents AS city,
          b.country
   FROM userprofiletemp AS a
   LEFT JOIN userattributes AS b ON a.user_id=b.user_id
   WHERE typeofupdate='city')
UNION DISTINCT
  (SELECT a.user_id,
          c.city,
          c.country
   FROM userverify AS a
   LEFT JOIN userlogin AS b ON a.user_id=b.user_id
   LEFT JOIN userattributes AS c ON a.user_id=c.user_id
   WHERE b.active=1
     AND a.verifycity=0);

返回结果如下:

100 Melbourne Australia
200 NewYork America
300 Tokyo Japan
100 Sydney Australia

问题是查询会带来重复的 user_id(在本例中为 100)。 第一个查询中的详细信息对我来说是先例,如果 user_id 在第二个查询中重复,我不需要它。

有没有办法让 UNION 在列上成为 DISTINCT?在这种情况下,user_id? 有没有办法进行上述调用而不是重复 user_id's - 删除第二个。 我是否应该以不同的方式重新编写查询而不使用 UNION。 真的希望它作为一个查询 - 如果需要,我可以使用 SELECT 和 php 来清除重复项。

谢谢 亚当

【问题讨论】:

【参考方案1】:

mysql UNION 产生不同的行——但是,该行中的所有列值都必须是不同的。如果您希望将区分限制为单个或几列,当其他列不明确时,您可以将UNION 包装在子查询中,并将GROUP BY 包装在您希望唯一的列的子查询中.

这里我将整个UNION 包装在一个子查询中,给它一个别名,然后GROUP BY 所需的唯一列:

SELECT * FROM (

SELECT a.user_id,a.updatecontents as city,b.country
FROM userprofiletemp AS a
LEFT JOIN userattributes AS b ON a.user_id=b.user_id
WHERE typeofupdate='city'

UNION

SELECT a.user_id,c.city,c.country
FROM userverify AS a
LEFT JOIN userlogin AS b ON a.user_id=b.user_id
LEFT JOIN userattributes AS c ON a.user_id=c.user_id
WHERE b.active=1 AND a.verifycity=0

) aa GROUP BY user_id;

如果您想在区分中包含多个列,请将它们列在 GROUP BY 之后:例如 GROUP BY user_id, city


旁注:因为在这种情况下,UNION 没有提供所需的区别,所以简单地使用UNION 并显然是"UNION ALL is much faster than UNION" 没有任何好处,因此您可以使用UNION ALL 来加快速度查询。

【讨论】:

【参考方案2】:
(SELECT a.user_id,a.updatecontents as city,b.country
FROM userprofiletemp AS a
LEFT JOIN userattributes AS b ON a.user_id=b.user_id
WHERE typeofupdate='city')

UNION ALL

(SELECT a.user_id,c.city,c.country
FROM userverify AS a
LEFT JOIN userlogin AS b ON a.user_id=b.user_id
LEFT JOIN userattributes AS c ON a.user_id=c.user_id
WHERE b.active=1 AND a.verifycity=0
  AND a.user_id NOT IN
      ( SELECT user_id
        FROM userprofiletemp 
        WHERE typeofupdate='city'
      ) 
);

【讨论】:

【参考方案3】:

没有。您无法指定需要区分的确切字段。它仅适用于整行。

就您的问题而言 - 只需将您的查询设为子查询,并在外部查询 GROUP BY user_id

SELECT * FROM 
(SELECT a.user_id,a.updatecontents as city,b.country
FROM userprofiletemp AS a
LEFT JOIN userattributes AS b ON a.user_id=b.user_id
WHERE typeofupdate='city')

UNION DISTINCT

(SELECT a.user_id,c.city,c.country
FROM userverify AS a
LEFT JOIN userlogin AS b ON a.user_id=b.user_id
LEFT JOIN userattributes AS c ON a.user_id=c.user_id
WHERE b.active=1 AND a.verifycity=0) x
GROUP BY user_id

【讨论】:

您是否有机会通过 user_id 使用子查询和外部组向我推动正确的方向?以前没有这样做过,正在测试但没有很快到达那里...... @Adam:更新了答案。这就是查询的样子,但没有机会检查它是否正确 如果我想知道“x GROUP BY user_id”中的“x”是什么意思(我也在某处读过“a order by ...”),哪个文档/教程/link 你会推荐吗? @2rec: x 是它之前的嵌套查询的别名,因为每个查询都必须有一个别名。 @zerkms 我明白了,谢谢。所以这可以是我喜欢的任何字符串,我放什么都没关系,对吧?

以上是关于MYSQL UNION DISTINCT的主要内容,如果未能解决你的问题,请参考以下文章

mysql中union和union all的区别和注意点

mysql union和union all的区别

mysql union和union all的区别

mysql union all和union的区别

Mysql联合查询union和union all的使用介绍

mysql union和union all的区别