查询数组时出现问题。 (MySQL的/ PHP)

时间:2011-03-29 16:07:44

标签: mysql

我有一个由用户从动态表单输入的字符串数组。我想将数组的每个值与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)

谢谢

2 个答案:

答案 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