MySQL Query для получения отличительного идентификатора с несколькими WHERE - PullRequest
2 голосов
/ 31 января 2011

У меня замораживание мозга с тем, что изначально я думал, что это простой запрос.

У меня есть таблица, подобная следующей:

ID   DETAILID    NAME    
-------------------------------------------------
1    1           Sed ut perspiciatis unde
2    1           omnis iste natus error
3    1           sit voluptatem accusantium
4    1           doloremque laudantium
5    2           totam rem aperiam
6    2           labore et dolore
7    3           voluptate velit esse
8    3           occaecati cupiditate non
9    3           culpa qui officia
10   3           placeat facere possimus
11   3           Nam libero tempore

Я хочу найти поле ИМЯнесколько раз с LIKE '%%' (количество LIKE будет случайным), но я хочу вернуть только отдельный DETAILID, где все LIKE найдены в записях, где DETAILID одинаков.в кругах и быстро никуда.Кто-нибудь может помочь?

Ответы [ 5 ]

1 голос
/ 31 января 2011

Этот запрос дает вам DETAILID, которые соответствуют всем условиям LIKE

SELECT DETAILID
FROM
(
    select DETAILID, 1 as WhichMatch
    from tbl
    where NAME LIKE '%a%'
    UNION ALL
    select DETAILID, 2 as WhichMatch
    from tbl
    where NAME LIKE '%b%'
    UNION ALL
    select DETAILID, 3 as WhichMatch
    from tbl
    where NAME LIKE '%c%'
) SQ
GROUP BY DETAILID
HAVING COUNT(DISTINCT WhichMatch) = 3
0 голосов
/ 31 января 2011

Поскольку вы ищете ВСЕ значения «LIKE», которые вам нужно найти, вам понадобится ИЛИ между ними, COUNT (*), чтобы увидеть, сколько совпадений, и GROUP BY для идентификатора, а также HAVING, чтобы соответствовать рассчитывать, что вы ожидаете ...

select 
      DETAILID,
      count(*) RecsFound
   from 
      YourTable
   where 
          NAME LIKE '%a%'
       or NAME LIKE '%b%'
       or NAME LIKE '%c%'
       or NAME LIKE '%d%'
   group by
      DetailID
   having
      RecsFound = 4

Как вы упомянули, это может быть случайное число "похожих" квалификаторов и звучит так, как если бы это был динамически сконструированный SQL-запрос. Поэтому убедитесь, что количество предложений HAVING соответствует тем записям, с которыми вы тестируете.

РЕДАКТИРОВАТЬ - пересмотренный ответ переместить IF () в раздел

select 
      DETAILID
   from 
      YourTable
   where 
          if( NAME LIKE '%a%', 1, 0 ) 
        + if( NAME LIKE '%b%', 1, 0 ) 
        + if( NAME LIKE '%c%', 1, 0 ) 
        + if( NAME LIKE '%d%', 1, 0 ) = 4

Полагаю, я смотрел на нее из многорядной таблицы, где каждая запись представляла собой собственный элемент, для которого вы проверяли. Вы хотите, чтобы все значения в одной строке соответствовали ВСЕМ НРАВИТСЯ ... Хотя вы приняли другой ответ, вот еще один вариант БЕЗ использования всех различных объединений ...

Кроме того, проходит через таблицу ONCE вместо 2, 3, 4 или более через все союзы, затем группируется с помощью ... Он достигает записи ONCE, квалифицирует все 4 условия и завершается.

0 голосов
/ 31 января 2011

Я думаю, что самое простое решение - сделать это в нескольких запросах. Выбор count () для отдельного идентификатора с помощью WHERE и выбор количества () для отдельного идентификатора без условия where. Сравнение этих двух было бы идеальным способом определения того, соответствуют ли все «имена» «бешенств» вашему LIKE

0 голосов
/ 31 января 2011

Что ж, после прочтения ваших комментариев к двум другим ответам, я считаю, что вам это нужно -

Используйте И вместо ИЛИ в запросе -

SELECT DISTINCT DETAILID 
FROM MyTable
WHERE NAME LIKE '%something%'
   AND NAME LIKE '%someting1%'
   AND NAME LIKE '%someting2%'
0 голосов
/ 31 января 2011

Разве это не сработает?

SELECT DISTINCT DETAILID 
FROM MyTable
WHERE NAME LIKE '%something%'
   or NAME LIKE '%sometingelse%
...