2017-09-16 10 views
0

私は3つのテーブルを持っています。ユーザーテーブル。詩の表どの詩がどのユーザーに電子メールで送られたかを記録したテーブル。SQLヘルプが必要 - 送信された電子メールを追跡する

tblUser | tblEmailed | tblPoems 
------- | ----------- | -------- 
userid | userid  | poemid 
username | poemid  | poemname 
etc  | date  | etc 

私は今日詩を電子メールで送信されていないユーザーIDを選択して、彼らが以前に受け取っていないpoemidを選択1つのMySQLのクエリを書きたいです。

誰かが私を助けることができますか?

+0

はhttps://meta.stackoverflow.com/questions/333952/why-should-i-provide-anを参照してください。 -mcve-for-what-like-to-be-a-very-simple-sql-query – Strawberry

答えて

0

私は1つのクエリでこれまで私はできません実現した後、これで行くことにしました:

SELECT * FROM tblUser U 
LEFT JOIN tblEmailed E ON E.userid = U.userid AND E.date = CURDATE() 
WHERE E.userid IS NULL 
LIMIT 1 

SELECT * FROM tblPoems P 
LEFT JOIN tblEmailed E ON E.poemid = P.poemid AND E.userid = :userid 
WHERE E.poemid IS NULL 
LIMIT 1 
+0

あなたは1つのクエリ – Strawberry

+0

ストロベリーでこれを行うことができます、私を教えてください。 – Scotty

+0

オリジナルの投稿への私のコメントを見る – Strawberry

0

最初に行う必要があることは、今日電子メールで送信されていないユーザーを特定することです。あなたは、次のようなものを使用できることを行うには:user_idがある

SELECT p.poemid FROM tblPoems p WHERE p.poemid NOT IN (SELECT poemid FROM tblEmailed WHERE userid == user_id) LIMIT 1

SELECT u.userid FROM tblUser u LEFT JOIN tblemailed e on e.userid = u.userid WHERE e.date == CURDATE() AND COALESCE(e.poemid, '') == '' LIMIT 1

をその後、我々は、彼らが受け取るためには至っていない詩を見つけるためにuser_idことが必要になります最初のクエリからのユーザー

+0

またはちょうど良い種類の参加を使用してください – Strawberry

+0

「LEFT JOIN x ... WHERE x = .. .'は 'INNER JOIN x'と同じですが、ORDER BYのないLIMITはかなり意味がありません。 – Strawberry

+0

1人の結果を頼んで、SQLで新しい、つまりLIMITのようです。 – 0x11

関連する問題