2011-08-06 76 views
26

我有两个选择,我目前成功地作为一个UNION运行。MYSQL UNION DISTINCT

(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的 - 放下第二个。 我应该以不同的方式重写查询,而不是使用UNION。 真的想要它作为一个查询 - 我可以使用SELECT和PHP来清除重复,如果有必要。

THX 亚当

回答

28

号不能指定,你需要不同的与精确的领域。它只适用于整行。

由于您的问题 - 只要让你的查询子查询和外一个GROUP BYuser_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 
+0

任何机会,你可以给我推与子查询和外一组由正确的方向用户名?没有做过之前,测试但没有很快到达那里... – Adam

+0

@Adam:更新了答案。这就是查询的样子,但没有机会检查它是否正确 – zerkms

+0

如果我想知道'x GROUP BY user_id'中的'x'是什么意思(也是我读过'订单通过...'在某处),你会推荐哪个docs/tutorial/link? –

1
(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' 
    ) 
);