我正在用PHP编写一个使用MySQL数据库来存储信息的应用程序。它必须存储的信息之一是名称数组,但数组没有设置长度。它可以从一个到多个项目。有没有办法在MySQL中存储这个数组,并能够通过指定数组中的一个项来检索它?
例如,我希望能够在表格中存储这样的内容:
Foo Bar
-------------------
[baz,car] fiz
[abc,def] ghi
然后,我希望能够告诉MySQL只搜索上表中第一行的car
和SELECT
。
有没有可行的方法来实现这个?
答案 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)