sourcetip

MYSQL 유니언 구별

fileupload 2023. 10. 5. 23:28
반응형

MYSQL 유니언 구별

현재 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을 칼럼에서 구별할 수 있는 방법이 있습니까?이 경우 user_id?중복되는 user_id를 받지 않고 위의 통화를 할 수 있는 방법이 있을까요? - 두 번째를 드랍합니다.쿼리를 다르게 다시 작성하고 UNION을 사용하지 않아야 합니까? 정말 하나의 쿼리로 원합니다. 필요한 경우 SELECT와 PHP를 사용하여 중복을 제거할 수 있습니다.

아담

아니요. 구별해야 할 정확한 필드를 지정할 수 없습니다.전체 행에서만 작동합니다.

문제의 경우 - 쿼리를 하위 쿼리로 만들고 외부 쿼리로 만듭니다.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

MySQL은 서로 다른 행을 생성하지만 행의 모든 열 값은 서로 달라야 합니다.구별을 단일 또는 몇 개의 열로 제한하고자 하는 경우, 다른 열이 구별되지 않을 때, 다음 열을 감쌀 수 있습니다.UNION하위 query 및 고유하고자 하는 열별 하위 query.

여기서 전체를 포장합니다.UNION하위 query에서 가명을 지정한 다음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"보다 훨씬 빠르기 때문에" 를 사용할 수 있습니다.UNION ALL이 질문의 속도를 높이기 위해서입니다.

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

언급URL : https://stackoverflow.com/questions/6965333/mysql-union-distinct

반응형