Как выбрать DISTINCT Имя, где Dealer_ID в таблице MYSQL, предотвратить дублирование записей - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть MySQL Table и таблица, в которой я делаю следующий запрос: выберите Diferent Customer_Name в таблице, где Customer_ID = CED130828MJ8.

Цель этого запроса - получить список только для Customer_Name иCustomer_ID.

Иногда наверняка у Customer_ID отсутствует Customer_Name (да, я знаю об Unique KEY, но это НЕ ПРОБЛЕМА).Итак, потому что я делаю CONCAT, ЕСЛИ Customer_Name пусто, то Customer_Name = Customer_ID

Очевидно, ID_USER изменится.Вот запрос, который я делаю:

SELECT DISTINCT(
        IF(Dealer_Name<>'',
            CONCAT(Dealer_Name, '*',Dealer_ID),
            CONCAT(Dealer_ID, '*',Dealer_ID)
        )
      ) AS cc FROM received_invoices 
WHERE Customer_ID='CED130828MJ8' 
GROUP BY (cc) 
ORDER BY cc ASC";

И вот как выглядит результат этого запроса:

"BEST BUY LTD CO*BTB052YU96"

И почти работает, я имею в виду почти, потому что выбирается только один Customer_IDтаблицы, но если Customer_ID имеет две или более записей, он напечатает две записи.

Позвольте мне показать вам:

"GERARDO GARCIA RIVERA*GARG870805726"
"GERARDO GARSIA RIBERA*GARG870805726"
"JERARDO GARZIA RIVERA*GARG870805726"
"JUAN ANTONIO MUÑOZ*MUGJ540314TV4"
"GUAN ANTONIO MUNIOZ*MUGJ540314TV4"
"JUAN ANTOÑO MUÑIOS*MUGJ540314TV4"
"JUAN HANTOIO MUÑOC*MUGJ540314TV4"

НО ЧТО Я действительно хочу вместо этогоТолько получить 1 запись на Customer_ID, например:

"GERARDO GARCIA RIVERA*GARG870805726"
"JUAN ANTONIO MUÑOZ*MUGJ540314TV4"

Что мне не хватает? Что вы предлагали?

Заранее спасибо

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

SQL видит связанные строки как разные:
"GERARDO GARCIA RIVERA*GARG870805726" "GERARDO GARSIA RIBERA*GARG870805726" "JERARDO GARZIA RIVERA*GARG870805726"

Если вы хотите видеть только одну запись для Customer_ID, вы также получите одно имя, а не все.Если не имеет значения, какой из них будет отображаться, используйте для него min():
select if(Dealer_Name<>'', concat(min(Dealer_Name), '*',Dealer_ID), concat(Dealer_ID, '*',Dealer_ID) ) as cc from received_invoices where Customer_ID='CED130828MJ8' group by Dealer_ID order by cc asc";

Обратите внимание, что группировка теперь выполняется по Dealer_ID, а не по полной объединенной строке.

0 голосов
/ 28 ноября 2018

@ Мадхур Бхайя.

Прежде всего, спасибо за ваше внимание, ваш великий, как вы сказали, это ответ:

SELECT 
  CONCAT(IF(MAX(Dealer_Name) <> '', MAX(Dealer_Name), Dealer_ID), 
         '*', 
         Dealer_ID
        ) AS cc 
FROM received_invoices 
WHERE Customer_ID = 'CED130828MJ8' 
GROUP BY Dealer_ID 
ORDER BY cc ASC

В моем конкретном случае, может быть, нев других случаях, когда я делаю этот запрос, он выдает мне эту ошибку: Код ошибки: 1055. Выражение №1 списка SELECT отсутствует в предложении GROUP BY и содержит неагрегированный столбец 'facturacion.facturas_recibidas.Emisor_Razon_Social', который функционально не зависит от столбцов.в предложении GROUP BY;это несовместимо с sql_mode = only_full_group_by

Так что я гуглю по этому поводу, и я обнаружил, что когда возникает такая ошибка, я должен DISABLE-ONLY-FULL-GROUP-BY.

И вДля этого мне нужно изменить мой /etc/mysql/my.cnf Потому что у меня Ubuntu Linux, я делаю это следующим образом:

  1. sudo nano /etc/mysql/my.cnf

Затем снова выполните запрос, и вуаля !!, запрос работает нормально !!!!.

Так что теперь яНеобходимо изменить файл my.cnf после установки mysql на каждой платформе моих клиентов (Windows / Linux / MAC).

Во избежание этой ошибки.

0 голосов
/ 28 ноября 2018

Несколько наблюдений:

  • DISTINCT не является функцией.Поэтому вам не нужно использовать круглые скобки вокруг него.
  • DISTINCT с GROUP BY для того же столбца / псевдоним не требуется.

Попробуйте вместо этого следующее:

SELECT 
  CONCAT(IF(MAX(Dealer_Name) <> '', MAX(Dealer_Name), Dealer_ID), 
         '*', 
         Dealer_ID
        ) AS cc 
FROM received_invoices 
WHERE Customer_ID = 'CED130828MJ8' 
GROUP BY Dealer_ID 
ORDER BY cc ASC
...