Не удается объединить значения с GROUP_CONCAT в соединениях - PullRequest
0 голосов
/ 28 октября 2011

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

С помощью этого запроса я получаю идентификаторы, но разделители не устанавливаются, когда 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 Ответ

0 голосов
/ 28 октября 2011

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

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

Или, может быть, customfields - это необязательная таблица, но в этом случае вы должны были перевернуть таблицу или использовать RIGHT JOIN.

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

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
...