Подтвердить что ты не робот

МИНИСТР РАЗРАБОТКИ MYSQL

У меня есть два выбора, которые я сейчас выполняю как СОЮЗ успешно.

(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 для отсечения дубликатов, если это необходимо.

ТНХ Адам

4b9b3361

Ответ 1

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

По вашей проблеме - просто сделайте свой запрос подзапросом и во внешнем 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

Ответ 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

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 намного быстрее, чем UNION" поэтому вы можете использовать UNION ALL для ускорения этого запроса.