我有一个由用户从动态表单输入的字符串数组。我想将数组的每个值与itemid一起存储到一个表中(对所有人来说都是一样的)
我的查询当前正在使用implode将整个数组插入到一行的text_value中。
有没有办法而不是循环遍历数组并为数组中的每个值运行查询,以便我使用itemId查询每个数组值。
我在考虑使用itemId为数组添加另一个维度?这有可能吗?
当前查询:
$query = "INSERT INTO answers_tb (item_id, text_value)VALUES('$itemid','".implode(',', $answers) . "')";
这是print_r的数组:
数组([0] =>选项1 [1] =>选项2 [2] =>选项3 [3] =>选项4)
这是我要插入的表结构(item_id是外键):
**Field** | **Type** **Attributes**
answer_id | int(11) PRIMARY KEY
item_id | int(11) FOREIGN KEY
text_value | varchar(50)
引用的表格:
**Field** | **Type** | **Attributes**
item_id | int(11) | PRIMARY KEY
item_type | tinyint(1) |
user_id | int(11) |
unit_id | int(11) |
question_text | varchar(100)
question_text_2 | varchar(100)
item_desc | varchar(25)
item_name | varchar(25)
谢谢
答案 0 :(得分:0)
听起来你会更好地使用不同的桌面设计。
而不是answers_tb (item_id, text_value)
,请使用answers_tb (item_id, offset, value)
。
(主键为(item_id, offset)
。)
然后你会发现查询表格要容易得多。
编辑:您发布了以下表格结构:
**Field** | **Type** **Attributes**
answer_id | int(11) PRIMARY KEY
item_id | int(11) FOREIGN KEY
text_value | varchar(50)
如果我理解桌面设计,你的设计就是这样的:
questions
)表示应用程序用户提出的单个问题。它有一个问题ID,以及发布它的用户的ID。answers_tb
的每一行代表questions
引用的表item_id
行中问题的所有答案的集合。答案的区别在于它们在列条目中的显示顺序。我所说的是answers_tb
的这种设计不能很好地工作,因为你已经确定:很难查询存储在“数组”列中的答案。这就是为什么这种设计存在问题。更好的设计如下:
**Field** | **Type**
item_id | int(11)
answer_number | int
text_value | varchar(50)
其中item_id
仍然是外键,但主键是(item_id, answer_number)
。在这个设计中,表格的每一行,而不是包含相应问题的所有答案的集合,将只包含该问题的一个答案。这些行通过answer_number
中的不同值进行区分,但您知道每行与item_id
中的值对应的问题。这种设计更容易查询。
一般来说,您不应该尝试在列中存储数据数组,因为这会使搜索成为问题。在某些情况下,违反该规则是有道理的,但是你必须能够识别出你在这种情况下的情况。在这种情况下,您希望按存储的值进行搜索,因此不应该这样做。
答案 1 :(得分:0)
如果您将表格结构为item_id, astring
而不是item_id, alongconcatenatedstring
,则可以像这样插入:
$id=2;
$valueclause=function($string) use ($id) { return "('$id','$string')";};
array_walk($valueclause, $arr);
$values=implode(',',$arr);
$query= "INSERT INTO answers_tb (item_id, text_value) VALUES $values";
ETA:似乎有一个组合了auto_increment和另一列的主键可能很有用。所以考虑到你的表格结构:
**Field** | **Type**
answer_id | int(11)
item_id | int(11)
text_value | varchar(50)
您可以考虑像这样建立索引:
CREATE TABLE answers_tb(
item_id INT NOT NULL,
answer_id INT NOT NULL AUTO_INCREMENT,
text_value CHAR(50) NOT NULL,
PRIMARY KEY (item_id, answer_id)//note the 2 columns in the key
);
然后当你这样插入时:
INSERT INTO answers_tb (item_id, text_value)
VALUES (1,'thing'), (1,'foo'),
(17,'blah'),
(6,'beebel'), (6,'bar');
您的结果数据如下所示:
item_id, answer_id, textvalue
1, 1, thing
1, 2, foo
17, 1, blah
6, 1, beebel
6, 2, bar