CONCAT с GROUP_CONCAT в MySQL - PullRequest
       21

CONCAT с GROUP_CONCAT в MySQL

1 голос
/ 22 сентября 2011

Так что я везде искал ответ на этот вопрос, но пока не повезло. Буду признателен за любую оказанную помощь. Я новичок в MySQL (перевод из фонового FileMaker Pro).

У меня есть база данных, где я храню информацию о перспективах нашего бизнеса. У меня есть вопрос о размещении информации для просмотра нашими пользователями. Таблица ЗАПРОС содержит информацию для каждого запроса (то есть, когда поступил запрос, статус запроса и т. Д.). Таблица PROSPECT содержит информацию о каждом потенциальном клиенте (потенциальном клиенте) (то есть имя, фамилия, возраст и т. Д.). Третья таблица , ЗАПРОСЫ , содержит информацию о наших контактах с потенциальным клиентом (то есть о дате следующего контакта, заметках, следующем действии и т. Д.). Каждая из этих таблиц связана с ключом queryID .

Каждый день пользователь будет приходить на экран, где ему будут представлены предложения / запросы, за которыми он / она будет следить в течение этого дня. Это те запросы, дата действий которых меньше или равна сегодняшней. Я хочу, чтобы список содержал queryID , перечисленные имена всех потенциальных клиентов, связанных с этим queryID (макс. 2), и дата действия .

Вот что я пробовал до сих пор:

SELECT inquiry.inquiryID,
   CASE WHEN prospect.lastName = '' THEN prospect.firstName
   WHEN prospect.firstName = '' THEN prospect.lastName
   ELSE CONCAT(prospect.lastName, ', ',prospect.firstName) END as fullName, inquiryNote.actionDate
FROM inquiry, prospect, inquiryNote
WHERE inquiry.inquiryID = prospect.inquiryID
AND inquiry.inquiryID = inquirynote.inquiryID
AND inquirynote.actionDate != \"0000-00-00\"
AND actionDate <= \"".date("Y-m-d")."\"
GROUP BY inquiryID ORDER BY actionDate";

Возвращает информацию, которую я ищу, но перечисляет только одну перспективу (даже если есть 2 для запроса).

Затем я попытался вставить GROUP_CONCAT (имя) в это, и он дал мне список имен проспекта, перечисленных в строке, разделенных запятыми (я все ближе). Затем я попробовал GROUP_CONCAT (фамилия, ',', имя) и затем GROUP_CONCAT (фамилия, имя), но опять-таки в нем будет указан только один проспект, а не несколько проспектов, разделенных запятыми.

Я хочу, чтобы переменная, которую я назвал fullName в приведенном выше коде, была включена в GROUP_CONCAT, чтобы в возвращаемых строках я видел список всех потенциальных клиентов, связанных с запросом. перечислены и разделены запятой.

Я хочу, чтобы таблица на созданной мной веб-странице имела следующие столбцы:

queryID | имя (а) имени (отчество) | Дата следующего действия

Опять же, пока я могу только получить:

queryID | 1 имя потенциального клиента | Дата следующего действия

Решение может быть чем-то простым, но, поскольку я новичок в MySQL, я потерян.

Пожалуйста, дайте мне знать, если вам нужно больше деталей.


ОБНОВЛЕНИЕ С РЕШЕНИЕМ, НО ПОХОЖИЙ ВОПРОС В КОНЦЕ


Проблема заключалась в том, что некоторые поля имени и фамилии имели значения NULL. По-видимому, GROUP_CONCAT теперь будет работать с нулевыми значениями. Этот запрос, которым я закончил, сработал, как только я избавился от всех значений NULL:

SELECT 
  inquiry.inquiryID, 
  inquiry.initialDate,
  inquiryNote.actionDate,
  GROUP_CONCAT(DISTINCT
    CONCAT(
      CASE WHEN prospect.lastName = '' THEN prospect.firstName
      WHEN prospect.firstName = '' THEN prospect.lastName
       ELSE CONCAT(
        prospect.firstName, ' ',prospect.lastName
      ) END
    ) SEPARATOR ', '
  ) AS prospectList,

GROUP_CONCAT(DISTINCT
    CONCAT(
      CASE WHEN influencer.lastName = '' THEN influencer.firstName
      WHEN influencer.firstName = '' THEN influencer.lastName
      ELSE CONCAT(
        influencer.firstName, ' ',influencer.lastName
      ) END
    ) SEPARATOR ', '
  ) AS influencerList

FROM inquiry, prospect, inquiryNote, influencer WHERE inquiry.inquiryID = prospect.inquiryID
AND inquiry.inquiryID = inquirynote.inquiryID
AND inquiry.inquiryID = influencer.inquiryID
AND inquirynote.actionDate != "0000-00-00" AND actionDate <= "2011-09-22"
GROUP BY inquiryID
ORDER BY actionDate;

Итак, последний вопрос: могу ли я заставить GROUP_CONCAT работать, даже когда он встречает значения NULL?

Ответы [ 2 ]

1 голос
/ 23 сентября 2011

Вы можете COALESCE столбцы, если они содержат NULL:

COALESCE (lastname, '') вернет пустую строку, если lastname было нулевым, или каким-либо другим значением lastname, если это не так.

0 голосов
/ 15 июля 2014

GROUP_CONCAT просто игнорирует (пропускает) значения NULL http://thinkdiff.net/mysql/mysql-the-group_concat-function/

...