我有一个看起来像这样的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%')
但我不确定这会如何起作用......
答案 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%))