php - mysql查询在数据库表中插入照片详细信息

标签 php mysql sql

我想构建一个查询以在数据库表中插入照片详细信息。这是我的表结构:

photos(photo_id, photo_title, caption, ....)
tags(tag_id, tag_name)
tag_asc(tag_id, photo_id)

一张照片有标题、标题和标签数组。我想:

  1. 在照片表中插入 photo_title 和标题。
  2. 将标签数组中的每个标签插入到标签表中。
  3. 在 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_idtag_asc.photo_id 上设置了非唯一索引以加快查询速度。
  • 作为OMG Ponies提到过,将此代码转换为存储的 SQL 过程可能是值得的。这将消除单独进行所有这些 SQL 查询所涉及的大量开销。

关于php - mysql查询在数据库表中插入照片详细信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5615153/

相关文章:

mysql - 仅当行包含值小于 1 的列时才获取行

javascript - 创建网络 map 应用程序。 Leaflet 还是 OpenLayers?

php - 解码 C++ 编码的 ASCII 扩展值?

php - 每周显示 Mysql 数据库中的一条记录

mysql - SQL读取网格矩阵

mysql - 多对多组合

php - Wordpress WooCommerce 文本属性

php - 用 PHP 显示日文字符

mysql - 根据不同的where条件在select查询中获取两个值并将它们相减

mysql - 无法在 MariaDb/Mysql 中创建 NVARCHAR 列