我正在尝试做以下事情: 我有两个表:ReportImage(imageId,reportId,counter) 和userReportedImages(imageId,userId)
我希望每个用户只能报告一次图像 - 这意味着首先我要检查'userReportedImages'中是否有一行(valueId,userId),如果这样做什么都没有,否则创建'ReportImage'中的一行带有值(imageId,reportId,counter),如果这样的行已经存在(其他用户报告该图像),那么我想提高计数器。
在检查相同的用户报告之前,我有以下声明:
INSERT INTO ReportImage VALUES (imageId,reportId,1) ON DUPLICATE KEY UPDATE counter = counter+1
这句话工作正常。
我试图更改此语句以首先检查该行是否存在于另一个表中,但我没有设法执行此操作,您能帮助我吗?
答案 0 :(得分:3)
首先,您需要在表UNIQUE
上定义ReportImage
约束或复合列主键,
ALTER TABLE ReportImage ADD CONTRAINT tb_uq UNIQUE(ImageID, ReportID)
尝试一下,
INSERT INTO ReportImage(ImageID, ReportID, Counter)
SELECT 'imageID HERE' AS ImageID,
'userID HERE' AS ReportID,
1 AS Counter
FROM userReportedImages a
LEFT JOIN ReportImage b
ON a.imageId = b.imageId AND
a.userId = b.ReportID AND
a.imageID = 'imageID HERE' AND
a.userID = 'userID HERE'
WHERE b.imageId IS NULL OR
b.ReportID IS NULL
ON DUPLICATE KEY UPDATE counter = VALUES(counter) + 1
答案 1 :(得分:0)
插入触发器应该是您的解决方案:link
答案 2 :(得分:0)
您可以尝试使用NOT EXISTS
insert into table2(`name`)
select * from (select 'name1' as name) tmp
where not exists(
select ('x') from table1 where name = 'test1'
);