Выбор из таблицы, где field = this и value = that - PullRequest
0 голосов
/ 06 октября 2009

У меня есть таблица MySQL, которая выглядит примерно так:

Row 1:
    'visitor_input_id' => int 1
    'name' => string 'country'
    'value' => string 'Canada'

Row 2:
    'visitor_input_id' => int 1
    'name' => string 'province'
    'value' => string 'Alberta'

Row 3:
    'visitor_input_id' => int 1
    'name' => string 'first_name'
    'value' => string 'Jim'

Проблема в том, что мне нужно иметь возможность фильтровать его, чтобы пользователь мог создавать отчеты, используя это:

filter 1:
    'field_name' => string 'country'
    'field_operator' => string '='
    'field_value' => string 'Canada'

filter 2:
    'field_name' => string 'province'
    'field_operator' => string '!='
    'field_value' => string 'Alberta'

filter 3:
    'field_name' => string 'first_name'
    'field_operator' => string '%LIKE%'
    'field_value' => string 'Jim'

Я не совсем уверен, как будет выглядеть запрос, чтобы иметь возможность выбирать из этого, используя фильтры. Какие-либо предложения? (К сожалению, создание новой таблицы для более разумного хранения данных в настоящее время неосуществимо, поскольку в ней уже есть пользовательские данные)

Я думаю, это будет выглядеть примерно так:

if(field_name = 'province' THEN ADD WHERE field_value != 'Alberta')
if(field_name = 'country' THEN ADD WHERE field_value = 'Canada')
if(field_name = 'first_name' THEN ADD WHERE field_value LIKE '%jim%')

но я не уверен, как это будет работать ...

Ответы [ 3 ]

0 голосов
/ 06 октября 2009

Оказывается, это похоже на работу:

SELECT * FROM visitor_fields

INNER JOIN visitor_inputs ON (visitor_inputs.input_id = visitor_fields.input_id)

INNER JOIN visitor_fields as filter_0 
ON (filter_0.input_id=visitor_inputs.input_id 
AND filter_0.field_name = 'province'
AND filter_0.field_value != 'Alberta')

INNER JOIN visitor_fields as filter_1 
ON (filter_1.input_id=visitor_inputs.input_id 
AND filter_1.field_name = 'country'
AND filter_1.field_value = 'Canada')

INNER JOIN visitor_fields as filter_2 
ON (filter_2.input_id=visitor_inputs.input_id 
AND filter_2.field_name = 'first_name'
AND filter_2.field_value LIKE '%jim%')
0 голосов
/ 06 октября 2009

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

vistor
----------------
vistor_id
firstname
province
country

Вы можете просмотреть приведенную ниже инструкцию на любом языке сценариев (PHP, TSQL, на любом языке сценариев, который вам наиболее удобен). Просто возьмите список всех vistor_id и пройдите по ним через sql ниже, заменив x на visitor_id.

INSERT INTO visitor (visitor_id, name, province, country) VALUES X,
(SELECT value FROM old_table WHERE name='first_name' AND vistor_id = x),
(SELECT value FROM old_table WHERE name='province' AND vistor_id = x),
(SELECT value FROM old_table WHERE name='country' AND vistor_id = x);

Будет создана таблица, в которой все данные посетителя находятся в одной строке.

0 голосов
/ 06 октября 2009

Можете ли вы создать строку SQL и затем выполнить ее? Строка будет выглядеть так:

SELECT * FROM yourtable
WHERE (name='country' AND value='Canada') AND
      (name='province' AND value!='Alberta') AND
      (name='first_name' AND value LIKE '%jim%)

EDIT:

Понятно. Несколько записей. Поэтому попробуйте присоединиться к ним. Это не правильный синтаксис SQL, но должен выглядеть примерно так:

SELECT * FROM
 (SELECT * FROM yourtable WHERE (name='country' AND value='Canada'))
JOIN on visitor_input_id
 (SELECT * FROM yourtable WHERE (name='province' AND value!='Alberta'))
JOIN on visitor_input_id
 (SELECT * FROM yourtable WHERE (name='first_name' AND value LIKE '%jim%))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...