3

次のことをしようとしています: ReportImage (imageId、reportId、counter) と userReportedImages (imageId、userId) の 2 つのテーブルがあります。

すべてのユーザーが一度だけ画像を報告できるようにしたい - これは、最初に「userReportedImages」に値 (imageId、userId) を持つ行があるかどうかを確認する必要があることを意味します。値(imageId、reportId、counter)を持つ「ReportImage」。そのような行がすでに存在する場合(他のユーザーがその画像を報告した場合)、カウンターを上げたいと思います。

これまでのところ、同じユーザーレポートを確認する前に、次のステートメントがありました。

INSERT INTO ReportImage VALUES (imageId,reportId,1) ON DUPLICATE KEY UPDATE counter = counter+1

このステートメントは正常に機能しています。

行が他のテーブルに存在するかどうかを最初に確認するようにこのステートメントを変更しようとしましたが、うまくいきませんでした。

4

3 に答える 3

3

UNIQUEまず、 tableReportImageに制約または複合列の主キーを定義する必要があります。

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
于 2013-03-24T15:40:00.920 に答える
1

あなたは使用してみることができますNOT EXISTS

insert into table2(`name`)
select * from (select 'name1' as name) tmp
where not exists(
  select ('x') from table1 where name = 'test1'
  );

SQL フィドル

于 2013-03-24T15:51:55.973 に答える
0

挿入トリガーが解決策になるはずです: リンク

于 2013-03-24T15:29:53.820 に答える