使用不同的值更新多个MySQL行

时间:2014-05-17 06:33:47

标签: php mysql

注意:我意识到这可能会令人困惑,因为下面的表和列,所以这里是我提到的两个表的简化版本:

表“类别”包含列:id,类型

表“条目”包含列:id,categories,...

我有一个名为entries的MySQL表,其中一列名为categories,是一串管道分隔的索引。例如,“| 1 | 2 | 3 |”可能是一个可能的值和“| 1 | 3 | 4 |”可能是另一个。数字代表表类别的索引。

我正在编写一个管理脚本,允许将新行插入到类别表中,在执行此操作时,表格的相应行应更新“类别”列。例如,如果类别表的新插入行具有索引5,则“5 |”应该连接到条目表的每个适当的列类别。

我意识到在添加新类别时我可以在每个适当的条目行使用UPDATE,但我想知道是否有更好的方法来解决这个问题。如果不清楚,我知道这是一个选项,但想知道是否可以将其作为一个语句(伪代码):

foreach ($entriesToUpdate as $currEntry)
"UPDATE entires SET categories='".$currValue."|".$newIndex."' WHERE id=".$currId;

1 个答案:

答案 0 :(得分:2)

这可以通过基于表达式的更新来完成:

UPDATE entries SET categories=CONCAT(categories, "5|") WHERE id IN (1,2,3,4,...)

5|代替您的示例中的5|,因为您的示例似乎表明现有值将以|已经开始和结束。)


尽管如此,您可能会更好地使用数据库模式,该模式存储条目到单独的多对多表中的类别的映射。例如:

<强>类:

id | type | ...
---------------
1    ...
2    ...
3    ...

<强>项:

id  | ...
---------
100   ...
101   ...
102   ...

<强> entries_to_categories:

entry | category
----------------
100     1
100     2
101     3

然后,您可以根据需要使用JOINs检索类别集,或检查某个类别中是否存在某些内容。在这种情况下,条目100位于类别12中,条目101位于类别3中,条目102位于否类别。