0

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

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

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

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

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

4

2 回答 2

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
于 2012-07-27T02:10:06.113 回答
0

任何一个

SELECT Bar FROM tbl
WHERE FIND_IN_SET('car', Foo)
于 2012-07-27T02:05:36.400 回答