#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. Я понимаю, но мне все еще не ясно, что вам на самом деле нужно. Я не хотел быть грубым, но это действительно может помочь забыть как о реальных попытках, так и просто повторить попытку, объясняя реальную проблему и отношения между таблицами. То есть, если моя вторая попытка также не делает то, что вам нужно. 🙂