我必须更新TABLE File
上的列TEST
。此列包含与该行相关的文件。每个文件由|
分隔。
一个例子可能是
ID NAME FILE
1 apple fruit.png | lemon.png
现在,当我向FILE
列添加新文件时,我使用此查询:
$link->query("UPDATE TEST SET File = CONCAT(File, '$dbfilename') WHERE id = '$p_id'")
其中$dbfilename
可以是pineapple.jpg |
问题是,如果$dbfilename
值已经File
,则会再添加一次,结果加倍。
如何检查File
是否已包含$dbfilename
,如果是,则不添加ID,甚至不执行查询?
答案 0 :(得分:2)
这不是在数据库中存储信息的好方法。但我会在一秒钟内完成。要直接回答您的问题,可以将其用作SQL查询:
UPDATE TEST SET File = CONCAT(File, '$dbfilename')
WHERE id='$p_id'
AND File NOT LIKE '%$dbfilename%'
AND Lingua='$linguadilavoro'
但是,当一个文件pineapple.jpg
并且您尝试添加another-pineapple.jpg
真的,我认为你应该考虑这对数据库来说是多么糟糕的方法。考虑将文件分成第二个表。例如:
# a table for the fruit names
CREATE TABLE fruits (
id INT UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(250) NOT NULL,
UNIQUE INDEX(name)
);
# a table for file names
CREATE TABLE files (
fileid INT UNSIGNED NOT NULL DEFAULT PRIMARY KEY AUTO_INCREMENT,
fruitid INT UNSIGNED,
filename VARCHAR(250),
UNIQUE INDEX(fruitid, filename)
);
# find all of the fruits with their associated files
SELECT fruits.id, fruits.name, files.filename
FROM fruits LEFT JOIN files ON fruits.id=files.fruitid
# add a file to a fruit
INSERT INTO files (fruitid, filename)
VALUES ('$fruitID', '$filename')
ON DUPLICATE KEY UPDATE fruitid=LAST_INSERT_ID(id)
答案 1 :(得分:1)
您必须为FILE
选择ID。
然后使用explode将其分解为数组
然后检查使用in_array来确定是否应该添加
以下是一些(未经测试的)指导代码
$stmt = $link->query("SELECT File File from TEST WHERE id = '$p_id'");
$rec = $stmt->fetchAssoc();
$files = explode(" | ",$rec["FILE"]);
if (!in_array($dbfilename, $files)){
// add to FILE
} else {
// it's already there
}
答案 2 :(得分:0)
我会重新设计你的表结构并添加一个包含以下列的新表文件,而不是使用varchar字段表示多个值:
Table Test
TableId, Name
Table File
FileId, TestId, FileName