从表中选择field = this和value = that

时间:2009-10-06 15:08:54

标签: sql mysql

我有一个看起来像这样的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 :(得分:0)

事实证明这似乎有效:

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%')

答案 1 :(得分:0)

我知道你说创建一个具有更好模式的新表是不可行的,但重组数据会使查询更加高效并且更易于使用。只需创建一个新表(在我的示例中称为访问者)。然后从旧表中选择以填充新的访问者表。

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);

这将生成一个表格,其中所有访问者的数据都在一行中。

答案 2 :(得分:-1)

您是否可以创建SQL字符串然后执行它?字符串看起来像这样:

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

编辑:

我明白了。多条记录。所以尝试加入他们。这是正确的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%))
相关问题