2016-04-06 1 views
1

MySqlを使用して、temp_commentsからコメントにデータを選択(および後で挿入)する必要があります。アカウント| |ここではそのための記録、APNと(temp_commentsからID#4コメントに選択及び挿入されるべき全てを除いて、この場合、例えば、いくつかのテストデータMySqlは、レコードを除外する単一の共通フィールドを持たない2つのテーブルを結合します。

comments table 
id | apn | account | comment 
-------------------------------- 
1 | 100 |   | todays comment 
2 | 101 |   | yesterdays comment 
3 | 109 |   | todays comment 
4 | 122 |   | more comments 
5 |  | 34550  | todays comment 
6 |  | 12433  | another comment 


temp_comments table 
id | apn | account | comment 
----------------------------------------- 
1 | 92 |   | todays comment 
2 | 99 |   | another comment 
3 | 100 |   | more comments 
4 | 109 |   | todays comment 
5 |  | 34588  | new comment 

すべて一致コメント行コメント表に)。

私は挿入を試みる前に、作業select文を取得してみました:

select apn, account, comment 
from temp_comments 
where not exists(select apn, account, comment 
from temp_comments 
except 
select apn, account, comment 
from comments) 

MySQLで動作しませんEXCEPTので、これはエラーをポップ。 3つのフィールドすべてが、それを除外したい私のために一致する必要があるので、代わりに結合を使用する方法はわかりません。他のテーブルで一致していない1つの表のすべての行を検索しLEFT JOINを使用し

INSERT into comments 
apn, account, comments 
SELECT (and put my working SELECT statement HERE) 

答えて

2

:私はSELECT作業を取得すると、私のような、コメントの中に挿入する必要があります。

SELECT tc.apn, tc.account, c.comment 
FROM temp_comments AS tc 
LEFT JOIN comments AS c ON c.apn <=> tc.apn AND c.account <=> tc.account AND c.comment <=> tc.comment 
WHERE c.id IS NULL 

またはNOT EXISTSと:

Barmarの提案@パー
SELECT apn, account, comment 
FROM temp_comments AS tc 
WHERE NOT EXISTS 
    (SELECT * 
    FROM comments AS c 
    WHERE c.apn <=> tc.apn AND c.account <=> tc.account AND c.comment <=> tc.comment) 
+0

これは実際には私のコメントではなく、temp_commentsの結果を得ています。私の編集に注意してください - 私は3つのフィールドすべてでCONCATを使用してデータを取り出す方法を見つけました。 – pokerPro

+0

申し訳ありません、私はちょうどそれらを後方に持っています。 – Barmar

+0

解決策を質問に編集するのではなく、回答として投稿する必要があります。 – Barmar

0

、私は私の答えを投稿だけではなく、私の元の質問で編集としてそれを残しています。また、@barmarは11-20でコメントしました - コメントCONCATは1-120-Commentと同じですので、私はそれを防ぐために編集を行いました。

選択を行うには、フィールドを連結して3つのフィールドをすべて比較します。注:値がない場合は、apnまたはaccountがnullであるため、適切な結果を得るためにIFNULLを追加する必要がありました。リストにある表では明確ではありませんでした。 SELECTに使用したコードは次のとおりです。

関連する問題