我正在为我们的小公司实施时间跟踪解决方案。我有这个查询通过Perl脚本插入到表中。基本查询工作正常,但我有两个输入project_id
和category_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
答案 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`)
感谢您的帮助!