在一个字段中包含多个项目的表

时间:2014-02-24 23:54:21

标签: mysql

我几乎是一个MySql新手,很抱歉,如果这听起来很糟糕,或者我在主题上絮絮叨叨。

我正在建立一个表格,列出有关展览的所有数据。这包括具有诸如场地,日期,时间等数据的字段以及具有展示的项目列表的一个字段。该字段将具有分隔的数字列表。它们将介于1到50之间,范围为1到999,目前num_max为170。

我意识到将这些数据保存在单独的表中会更好,但这会使上传过程变得复杂,需要为每个新展览创建一个新表格,并且会产生更多的错误机会。

假设这个策略是正确的,我真正的问题是处理数据。

如何提取数字列表,然后使用它从主产品表中获取产品编号数组?

3 个答案:

答案 0 :(得分:0)

您应该只需要一个表,其中包含要包含在展览中的项目。这个表可以有一个展览的几行,如下所示:

exhibit_id       item_id       description
______________________________________________
     1              1            painting
     1              2            statue

然后,您需要做的就是将两个表连接在一起。

否则,如果您不想这样做,请使用php explode方法将分隔的字符串转换为数组。     $ data = mysql_query($ query);

while ($row = mysql_fetch_assoc($result)) {
     $items = $row['items'];

     //the explode method in php allows you to turn a delimited string into an array.
     $items_array = explode(',', $items);

     //loop through each of the items in this exhibit
     foreach($items_array as $current_item) {
         //do something with $current_item
     }
}

答案 1 :(得分:0)

如果你要持有一个包含“2,45,67,126”等数据的字段,那么你将不得不使用你正在提取它的语言来处理它,也许是PHP。

“真正的”解决方案是在举办展览的桌子上有一个唯一的标识符,并有第二个表格与项目。例如,你的展览会有一个'42'的id,然后是第二个表(称为'items'),其中包含:

id   item
42     2
42    45
42    67
42   126

这不应该使您的上传过程太复杂,然后您可以使用以下方式轻松返回展览中的所有项目:

SELECT item FROM items WHERE id=$exhibition_id

答案 2 :(得分:0)

实际上,每个展览不需要新表,只需在现有表中添加行。

子表中的行将通过外键与父表“相关”。

例如

exhibit
( id     int auto_increment primary key comment 'PK unique identifier for exhibit'
, exhibit_venue
, exhibit_date
  et al.
)

exhibit_item
( exhibit_id int comment 'fk to exhibit.id'
, item_id    int comment 'fk to item.id'
, primary_key (exhibit_id, item_id)
, foreign_key exhibit_items_fk1 (exhibit_id) references exhibit (id)
, foreign_key exhibit_items_fk2 (item_id) references item (id)
)

item
( id      int auto_increment primary key comment 'PK unique identifier for item'
, name 
, description 
, size
, weight
et al.
)


exhibit
  id    venue   date  
  ----  ------- -----------
  123   Fox     2014-02-24
  124   Ice     2014-03-01     

item
  id    name       description
  ----  --------   -----------
  41    madonna    painting   
  42    david      sculpture
  43    mona lisa  painting

exhibit_item
  exhibit_id  item_id
  ----------  -------
  123         41
  123         42
  123         43

如果您需要存储展览中项目的相对序列或位置(相对顺序),您可以向exhibit_item表添加另一个属性,以存储表示该位置的整数。

获取一个展览的所有项目:

SELECT i.id
     , i.name
     , i.description
  FROM exhibit_item s
  JOIN item i
    ON i.id = s.item_id 
 WHERE s.exhibit_id = 123
 ORDER BY s.position

如果您更容易在展览中返回以逗号分隔的商品ID列表,则作为单个字符串...

SELECT GROUP_CONCAT(s.id ORDER BY s.position) AS item_list
  FROM exhibit_item s
 WHERE s.exhibit_id = 123