СОЮЗ не удаляет дубликаты - PullRequest
0 голосов
/ 08 апреля 2020

Я пытаюсь запросить 2 таблицы, вернуть значения при объединении дубликатов. В то время как UNION должен удалить дубликаты, в этом случае, похоже, произойдет сбой. Обратите внимание, что этот запрос отправляется с PHP.

QUERY

<?php

$keywords = 'MOTOR';

$toSend = "SELECT part as Column1, '' as Column2 FROM soldParts WHERE part LIKE '%".$keywords."%' UNION SELECT part as Column1, vin as Column2 FROM vinData WHERE part LIKE '%".$keywords."%' ORDER BY column1 ASC";

?>


ТЕКУЩИЙ ВЫХОД

Столбец1 Столбец2

двигатель 1

двигатель 2

Двигатель 2 CCDD44

Двигатель 3 AABB1122

Двигатель 3


Желаемый выход

Столбец 1 Столбец2

двигатель 1

двигатель 2 CCDD44

двигатель 3 AABB1122


Я посмотрел несколько похожих вопросов. Тем не менее, мой второй столбец должен быть просто объединен (или объединен), в отличие от других вопросов и / или они не включают несколько таблиц. Также обратите внимание, что таблица soldParts Column2 не имеет значения.

Ответы [ 2 ]

2 голосов
/ 08 апреля 2020

Ваш результирующий набор фактически не имеет дубликатов. Дубликаты - это строки, в которых все столбцы имеют одинаковые значения, и ни одна строка в вашем наборе результатов не соответствует этому определению.

Предположительно, вы хотите агрегировать во внешнем запросе:

select column1, max(column2) column2
from (
    select part as column1, null as column2 from soldparts where part like ?
    union all
    select part as column1, vin as column2 from vindata where part like ?
)
group by column1
order by column1 asc

Обратите внимание, что я изменил ваш запрос на использование параметров связывания (?); ради безопасности и эффективности вы должны научиться использовать параметризованный запрос, а не объединять переменные в строке запроса.

1 голос
/ 08 апреля 2020

Чтобы получить желаемый результат, вам нужно выполнить агрегирование поверх UNION (но до ORDER BY).

Например:

select Column1, max(Column2) as Column2
from (
  SELECT part as Column1, '' as Column2 
  FROM soldParts 
  WHERE part LIKE ?
  UNION 
  SELECT part, vin
  FROM vinData 
  WHERE part LIKE ?
) x
GROUP BY Column1
ORDER BY Column1
...