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的主要内容,如果未能解决你的问题,请参考以下文章