2012-04-27 3 views
1

У меня есть запрос, который работает как шарм, но теперь мне нужно отфильтровать его на значение, которое в настоящее время находится в GROUP_CONCAT. я узнал, что я могу использовать HAVING для фильтрации, но я не могу найти синтаксис для использования, поскольку HAVING groupconcatname LIKE '%6%' найдет 6, 16, 26 и т. д. Мне нужно, чтобы оператор выполнял поиск определенных значений, чтобы он мог найти «8 "в группе groupconcat, содержащей 1,5,8,18,30,58, а не найти 8 И 18 И 58, потому что я использовал LIKE '%%'.MySQL HAVING с определенным номером внутри GROUP_CONCAT

Мои запросы (работает прямо сейчас .. но находит слишком много результатов, основанные на частичном матче %6%):

SELECT offers.*, s.short_name AS sponsorName, s.logo AS sponsorLogo, GROUP_CONCAT(mn.title) titles, 
    GROUP_CONCAT(mo.`name`) metas, GROUP_CONCAT(om.meta_option) AS meta_ids 
FROM offers 
INNER JOIN offer_metas as om ON om.offer_id = local_ld_offers.id 
INNER JOIN meta_options as mo ON om.meta_option = mo.id 
INNER JOIN meta_names as mn ON mo.category = mn.category AND mo.cat_seq = mn.seq 
LEFT JOIN sponsors AS s ON s.id=offers.sponsor 
GROUP BY offers.id 
HAVING meta_ids LIKE '%6%' 
ORDER BY end_date ASC 

Мне нужно заменить HAVING meta_ids LIKE '%6%' с чем-то более похожее на WHERE '6' IN meta_ids, но когда я пытаюсь чтобы заменить инструкцию HAVING, с тем, что кажется разумной попыткой функционирования WHERE, он игнорирует тот факт, что meta_ids - допустимая переменная/поле для использования в моем предложении и ошибках.

Любые рекомендации?

Спасибо,

Silver Tiger

UPDATE - решаемые, если есть более элегантный способ

на основе рекомендаций от Thomas ниже я обновил запрос и, видимо, я могу найти так как мне необходимо добавить несколько отдельных значений, добавив линию на один вариант с использованием обновленного метода следующим образом:

WHERE EXISTS(SELECT * FROM offer_metas AS om1 WHERE om1.meta_option = mo.id AND om1.meta_option = '23') 
OR EXISTS(SELECT * FROM offer_metas AS om1 WHERE om1.meta_option = mo.id AND om1.meta_option = '16') 

ответ

2

Непонятно, что именно здесь задают (некоторые тестовые входы с ожидаемыми выходами помогли бы), но это не похоже на то, что вам действительно нужна фраза «Бытие». Если вы хотите, чтобы фильтр для значений, где говорят om.meta_option «как» 8, а затем добавить ИНЕКЕ следующим образом:

Where Exists (
       Select 1 
       From meta_options As om1 
       Where om1.meta_option = mo.id 
        And om1.meta_option = Like '%8%' 
       ) 

Конечно, это возвращение строк там, где существует 8, 80, 18 и 181. Если вы ищете конкретное значение, равное 8, а затем использовать:

Where Exists (
       Select 1 
       From meta_options As om1 
       Where om1.meta_option = mo.id 
        And om1.meta_option = '8' 
       ) 

Если то, что вы ищете является рядом значений, то вы можете сделать что-то вроде:

Where Exists (
       Select 1 
       From meta_options As om1 
       Where om1.meta_option = mo.id 
        And om1.meta_option In('8','23') 
       ) 

Помните, что цель предложения Have для применения фильтров после группировка и предложение Where применяют фильтры до группировки. В этом случае, похоже, что фильтрация должна произойти до группировки, и поэтому должно быть использовано предложение Where.

+0

проблема заключается в том, что om.meta_option является полем, которое может быть полем (следовательно, необходимость использования GROUP_CONCAT). Я не могу напрямую запросить om.meta_option, так как он не будет относительным результатом и не вернет другую объединенную таблицу. Мне нужно искать и фильтровать/сопоставлять в group_concat для обеспечения правильных результатов. – Silvertiger

+0

@Silvertiger - предложение Exists, поскольку я написал, что он учитывает другие файлы, потому что соединения фильтруют строки meta_options, которые следует рассматривать в дополнение к предложению Exists. Тем не менее, если вы беспокоились об этом, вы можете просто расширить предложение Exists. – Thomas

+0

@Silvertiger - Имейте в виду, что эффект предложения Where будет заключаться в том, что, например, '8' существует где-то в результате результата group_concat. Условие предложения, как я написал, делает то же самое. – Thomas

0

Вы можете изменить HAVING meta_ids LIKE '%6%' на номер HAVING meta_ids LIKE '%,6,%' OR '6,%' OR '%,6' OR '6', который должен получить то, что вы ищете.

Альтернативы включают такие вещи, как подзапросы, например, оператор% не очень приятный.

+0

да ..но это то же самое, что «как«% 6% », так как вы находите«, 6 », а также« 26 », а также« 68 »и т. д., что exaserbates ситуации. – Silvertiger

+0

Дополнительные случаи удостоверяются, что они учтены: (6 между другими номерами) или (6 как начало) или (6 как окончание) или (6 самостоятельно) – hkf

+0

Не уверен, что вы на самом деле пытались решить мое решение, поскольку он рассматривает все случаи для возможностей «6» в «meta_ids». – hkf

Смежные вопросы