我想构建一个查询以在数据库表中插入照片详细信息。这是我的表结构:
photos(photo_id, photo_title, caption, ....)
tags(tag_id, tag_name)
tag_asc(tag_id, photo_id)
一张照片有标题、标题和标签数组。我想:
- 在照片表中插入 photo_title 和标题。
- 将标签数组中的每个标签插入到标签表中。
- 在 tag_asc 表中插入 tag_id 和 photo_id(将标签与照片链接起来)。
我提出了以下三个查询来完成上述任务。
mysql_query("INSERT INTO photos (photo_title, caption)
VALUES ($title, $caption)");
$photo_id = mysql_insert_id(); //get photo_id
foreach ($tags as $tag){
mysql_query("INSERT INTO tags (tag_name)
VALUES ($tag)");
$tag_id = mysql_insert_id(); //get tag_id
mysql_query("INSERT INTO tag_asc (tag_id, photo_id)
VALUES ($tag_id, $photo_id)");
}
我的问题
如果上述方法很好,或者是否有更有效的方法来做同样的事情?
最佳答案
您所做的大部分工作看起来都不错。我看到的主要问题是重复标签的可能性。
最好检查标签是否存在,如果存在则获取现有标签的 ID,而不是每次都创建一个新标签。这将防止将重复的标签名称插入到 tags
表中。如果您知道每个标签都是唯一的,这可以加快以后的速度 — 例如,您可以通过标签 ID 搜索照片,而不必执行一些困惑的 JOIN
操作。
- 给
tags.tag_name
一个唯一索引(如果它还没有的话)。 - 使用以下函数获取标签 ID。如果标签已经存在,将返回现有的行 ID。否则,将创建一个新行并返回其 ID。
-
function select_or_create_tag($tag_name) {
$tag_name = addslashes($tag_name);
$result = mysql_query("SELECT id FROM tags WHERE tag_name='$tag_name'");
if ( mysql_num_rows($result) > 0 )
return mysql_result($result, 0, 0);
$insert = mysql_query("INSERT INTO tags (tag_name) VALUES ('$tag_name')");
return mysql_insert_id($insert);
}
示例用法,基于您的代码:
mysql_query("INSERT INTO photos (photo_title, caption)
VALUES ($title, $caption)");
$photo_id = mysql_insert_id();
foreach ( $tags as $tag ) {
$tag_id = select_or_create_tag($tag);
mysql_query("INSERT INTO tag_asc (tag_id, photo_id)
VALUES ($tag_id, $photo_id)");
}
还有:
- 确保您在
tag_asc.tag_id
和tag_asc.photo_id
上设置了非唯一索引以加快查询速度。 - 作为OMG Ponies提到过,将此代码转换为存储的 SQL 过程可能是值得的。这将消除单独进行所有这些 SQL 查询所涉及的大量开销。
关于php - mysql查询在数据库表中插入照片详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5615153/