MySQL中的可变长度数组

时间:2012-07-27 02:00:50

标签: mysql arrays

我正在用PHP编写一个使用MySQL数据库来存储信息的应用程序。它必须存储的信息之一是名称数组,但数组没有设置长度。它可以从一个到多个项目。有没有办法在MySQL中存储这个数组,并能够通过指定数组中的一个项来检索它?

例如,我希望能够在表格中存储这样的内容:

Foo        Bar
-------------------
[baz,car]  fiz
[abc,def]  ghi

然后,我希望能够告诉MySQL只搜索上表中第一行的carSELECT

有没有可行的方法来实现这个?

2 个答案:

答案 0 :(得分:2)

实现它的方法是“规范化”架构。有几个相关的想法包括架构规范化,但这里的关键点是你的数据应该用两个表和它们之间的关系来表示。这种关系被称为“一对多”,因为对于一个“Bar”,有一个或多个“Foo”。

然后,必要的步骤是向模式添加唯一标识符列(最简单的方法是使用自动递增整数),然后使用JOIN机制进行查询以关联数据。

这就是为什么我们称MySQL(和许多其他人)为“关系型”数据库。

Bar
+----+----------+
| id |   name   | 
+----+----------+
| 01 |   fiz    |
+----+----------+
| 02 |   ghi    |
+----+----------+


Foo
+----+--------+----------+
| id | bar_id |   name   | 
+----+--------+----------+
| 01 |   01   |  baz     |
+----+--------+----------+
| 02 |   01   |  car     |
+----+--------+----------+
| 03 |   02   |  abc     |
+----+--------+----------+
| 04 |   03   |  def     |
+----+--------+----------+

以下是联接看起来在Foo关系中选择基于“car”的“fiz”记录

SELECT 
  Bar.* 
FROM Bar 
  JOIN Foo ON Bar.id = Foo.bar_id 
WHERE Foo.name = "car"

如果你想要每个栏的Foo关系的整个列表与匹配的Foo:

SELECT 
  Bar.*, 
  GROUP_CONCAT(Foo.name) 
FROM Bar 
  JOIN Foo ON Bar.id = Foo.bar_id 
WHERE Foo.name = "car" 
GROUP BY Bar.id

答案 1 :(得分:0)

无论

SELECT Bar FROM tbl
WHERE FIND_IN_SET('car', Foo)