MYSQL UNION DISTINCT - PullRequest
       23

MYSQL UNION DISTINCT

29 голосов
/ 06 августа 2011

У меня есть два выбора, которые в настоящее время я успешно выполняю как 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 - отбросьте второй.Должен ли я переписать запрос по-другому и не использовать UNION.Очень хочу, чтобы это был один запрос - я могу использовать SELECT и PHP, чтобы отсеять дубликаты при необходимости.

thx Adam

Ответы [ 2 ]

32 голосов
/ 06 августа 2011

Нет. Вы не можете указать, какое именно поле вам нужно различать. Работает только со всем рядом.

Что касается вашей проблемы - просто сделайте запрос подзапросом, а во внешнем 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
1 голос
/ 06 августа 2011
(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'
      ) 
);
...