Не удается объединить значения с помощью GROUP_CONCAT при объединении

#mysql #group-concat

#mysql #group-concat

Вопрос:

Кто-нибудь может мне помочь?

С помощью этого запроса я получаю идентификаторы, но он не помещает разделители, когда subscriber_data.fieldid имеет значение null. Например, вместо 2,,12 он составляет 2,12, когда значение для 4 равно нулю…

Я думаю, что проблема связана с соединением с подзапросом, но я не смог сделать это и с двумя левыми соединениями в основном запросе…

Это запрос, который я использую:

 SELECT 
    list_subscribers.emailaddress, 
    (SELECT 
         GROUP_CONCAT(IFNULL(customfields.fieldid,'') SEPARATOR '","') 
     FROM customfields 
     LEFT JOIN subscribers_data 
         ON subscribers_data.fieldid = customfields.fieldid 
     WHERE 
         customfields.fieldid IN (2,4,12,13,14,15,17,19,20,21,22,23,16,26,27) 
             AND 
         list_subscribers.subscriberid = subscribers_data.subscriberid
    ) AS data FROM list_subscribers
 

Спасибо всем.

Ответ №1:

Левое соединение бесполезно. Поскольку у вас есть условие для subscriber_data в предложении WHERE, этот подзапрос не вернет те строки, для которых нет совпадающих subscriber_data , поэтому он эффективно работает так, как если бы вы использовали INNER JOIN . Вы должны добавить это условие к условию соединения слева, но это невозможно в этом макете запроса. Значения из внешнего запроса не допускаются в условиях объединения во внутреннем запросе.

Вы могли бы изменить это, но, очевидно, вам нужно объединить три таблицы, где средняя таблица subscriber_data, которая связывает их все вместе, является необязательной. На самом деле это не имеет смысла.

Или, может быть, customfields — это необязательная таблица, но в этом случае вам следовало бы перевернуть таблицу или использовать ПРАВИЛЬНОЕ СОЕДИНЕНИЕ.

В заключение, я думаю, вы хотели написать это:

 select
  s.emailaddress,
  GROUPCONCAT(IFNULL(f.fieldid, '') SEPARATOR '","')
from
  list_subscribers s
  inner join subscribers_data d on d.subscriberid = s.subscriberid
  left join customfields f on f.fieldid = d.fieldid
where
  d.fieldid in (2,4,12,13,14,15,17,19,20,21,22,23,16,26,27)
group by
  s.emailaddress
 

Или вы хотите перечислить идентификаторы полей, которые заполняются для подписчика (подписчиков)? В этом случае это было бы:

 select
  s.emailaddress,
  GROUPCONCAT(IFNULL(d.fieldid, '') SEPARATOR '","')
from
  list_subscribers s
  cross join customfields f
  left join subscribers_data d on 
    d.subscriberid = s.subscriberid and
    d.fieldid = f.fieldid
where
  f.fieldid in (2,4,12,13,14,15,17,19,20,21,22,23,16,26,27)
group by
  s.emailaddress
 

Комментарии:

1. «Вы могли бы изменить это, но, по-видимому, вам нужно объединить три таблицы, где средняя таблица subscriber_data, которая связывает их все вместе, является необязательной. На самом деле это не имеет смысла «. Это именно то, что я хочу. Запрос, который вы написали, по-прежнему не выводит нулевые значения.

2. В этом случае вам следует вернуться назад и попытаться описать, чего вы хотите достичь. Не путем отправки некорректного запроса, а с использованием фактического английского языка.

3. Сделал еще одно предположение. С этими данными вы можете сделать не так много.

4. Извините, если я прозвучал высокомерно, я просто хотел иметь в виду, что я действительно хотел того, что вы сказали. На самом деле, вместо subscribers_data.fieldid я бы получил subscribers_data.data , но для проверки, поступают ли все идентификаторы, я использую fieldid .

5. Я понимаю, но мне все еще не ясно, что вам на самом деле нужно. Я не хотел быть грубым, но это действительно может помочь забыть как о реальных попытках, так и просто повторить попытку, объясняя реальную проблему и отношения между таблицами. То есть, если моя вторая попытка также не делает то, что вам нужно. 🙂