Запрос к базе данных с любым подмножеством списка условий - PullRequest
0 голосов
/ 14 мая 2011

У меня есть база данных MySQL с несколькими столбцами (скажем, column0 .. column19).

Я хочу выбрать все строки базы данных, которые удовлетворяют условию формы:

column0 < value0 AND column1 < value1 AND ... AND column19 < value19.

Смысл в том, что я хочу выбрать строки, которые удовлетворяют ЛЮБЫМ 15 условиям из вышеперечисленных.

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

Возможно ли это с MySQL?Есть ли другая архитектура базы данных, которая позволяет такие запросы?

Спасибо

Ответы [ 2 ]

2 голосов
/ 14 мая 2011

Вы можете использовать ниже, но не ожидайте, что это будет работать особенно хорошо!

WHERE (CASE WHEN column0 < value0 THEN 1 ELSE 0 END + 
      CASE WHEN column1 < value1 THEN 1 ELSE 0 END + 
      ... + 
      CASE WHEN column19 < value19 THEN 1 ELSE 0 END) >= 15
1 голос
/ 14 мая 2011

Ответ Will также может быть записан как:

WHERE (  SUM( column0 < value0 ) 
       + SUM( column1 < value1 ) 
       ... + 
       + SUM( column19 < value19 ) 
      ) >= 15

Вышеуказанное будет работать только в MYSQL , но не в других базах данных.Итак, я полагаю, что лучше использовать стандарт CASE WHEN, чем этот.


Другой способ обработки такого запроса будет выглядеть так (id является первичным ключом таблицы):

SELECT * 
FROM yourTable
    JOIN
      ( SELECT id
        FROM yourTable
        WHERE column0 < value0
      UNION ALL
        SELECT id
        FROM yourTable
        WHERE column1 < value1
      UNION ALL
        ...
      UNION ALL
        SELECT id
        FROM yourTable
        WHERE column19 < value19

      GROUP BY id
      HAVING COUNT(*) >=15
      ) AS chk  
    ON chk.id = yourTable.id

Если имеется 20 индексов (по одному на каждые column0, column1, ..., column19), это может быть быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...