MySQL:如何从多个表中选择字段以插入第三个表?

时间:2015-05-21 22:10:59

标签: mysql perl

我正在为我们的小公司实施时间跟踪解决方案。我有这个查询通过Perl脚本插入到表中。基本查询工作正常,但我有两个输入project_idcategory_id,我需要使用它来从另一个表中选择要插入的id。

INSERT INTO `time_entries` (`project_id`, `user_id`, `category_id`, `start`)
 SELECT a.`project_id`, a.`user_id`, a.`category_id`, a.`start` FROM
   (SELECT
    (SELECT `id` FROM `projects` WHERE `title` = $scanin[0]) `project_id`,
  $scanin[1] `user_id`,
  (SELECT `id` FROM `categories` WHERE `barcode` = $scanin[2]) `category_id`,
   NOW() `start`) a
 WHERE NOT EXISTS
   ( SELECT 1 FROM `time_entries` WHERE `project_id` = (SELECT `id` FROM `projects` WHERE `title` = $scanin[0])
   AND `user_id` = $scanin[1]
   AND `category_id` = $scanin[2]
   AND `end` = '0000-00-00 00:00:00')

如果我从一个表中选择插入但是显然不适用于两个表,它可以正常工作。甚至可以这样做吗?我对简单的SQL语句非常好,但这很复杂,连接一直是我的问题。我只是不做很多。

time_entries    projects        categories
------------    --------        ----------
id                  id              id
project_id      title           barcode
user_id
category_id
start
end

2 个答案:

答案 0 :(得分:3)

这是一个非常混淆的查询,可以使用许多不必要的嵌套查询。

首先让它清理,假设有以下数据库结构;

projects     categories     time_entries
--------     ----------     ------------
id           id             id
cat_id       title          project_id
usr_id                      user_id
title                       user_id
                            category_id
                            start
                            end

我们可以将您的查询简化为更适合开发人员的版本;

INSERT INTO `time_entries` (`project_id`, `user_id`, `category_id`, `start`)

SELECT project_id, user_id, category_id, now()
FROM projects JOIN category ON projects.cat_id = category.id
WHERE project_id NOT IN (
          SELECT project_id
          FROM time_entries
          WHERE title = $scanin[0]
             AND `user_id` = $scanin[1]
             AND `category_id` = $scanin[2]
             AND `end` = '0000-00-00 00:00:00'
         )

好的,现在按照您的要求使用以下模式添加另一个表要容易得多;

INSERT INTO time_e... ,  column_n, column_n_plus_1
....
FROM proj....
      JOIN table_n on id_n = project_id
      JOIN table_n_plus_one on id_n_plus_one = project_id
....

答案 1 :(得分:1)

添加索引给了我正在寻找的行为。

ALTER TABLE `time_entries` ADD UNIQUE `unique_record_index`(`project_id`,`user_id`,`category_id`,`end`)

感谢您的帮助!