2016-06-15 9 views
0

私はさまざまなエンティティのための 'notes'を扱うテーブルデザインを持っています。3番目のテーブルを使用した1対多のクエリSQLite

notesテーブルには、主キー、notes_id、noteフィールド、created_by日付フィールドがあります。

エンティティの場合、顧客、リレーショナル表が存在し、customer_notesには2つのid、customer_idおよびnote(s)_idが含まれます。 1つの顧客に関連するすべてのノートを選択し、ノート日付に基づいてソートしたい。

SQLの初心者であるため、これをどうやって取得するのですか? 現在私は持っています:

SELECT * FROM note 
WHERE note.id 
IN (SELECT * FROM customer_note 
WHERE customer_id = 11) 

と11は顧客IDです。上記は私に「式の一部である選択に対してただ一つの結果」というエラーを与えます。

似たようなことについて多くの質問がありますが、大部分は2つのテーブルしか扱っていません。

答えて

0

メモIDだけでなく、サブクエリにすべての列を含めるので、クエリが正しくありません。

あなたがそうのように、一緒にテーブルを結合したほうが良いです:として

SELECT -- specify whichever columns you want from either table here 
    n.id 
    n.note, 
    n.note_date 
FROM 
    note n -- n is the alias for the note table 
INNER JOIN 
    customer_note cn -- cn is the alias for the customer_note table 
    ON (cn.note_id = n.id) -- These are the columns that the two tables share/join on 
WHERE 
    cn.customer_id = 11 -- Your filter criterion 
ORDER BY 
    note_date DESC; -- Sort on note_date (DESC or ASC) 
+0

説明と明確な書式設定は、これをすばらしい答えにします。 –

1

別のオプションは、問合せをリライトすることです:

SELECT * 
FROM note 
WHERE note.id 
IN  (SELECT note_id 
     FROM customer_note 
     WHERE customer_id = 11) 
ORDER BY note_date DESC; 
+0

'...とメモの日付に基づいてソート。 – Nicarus

+0

ありがとう!私の答えを改善しました。 –

0

Nicarusの回答に基づいて、私も働いて、次の得ました:

SELECT * 
FROM note 
WHERE note.id 
IN (
    SELECT note_id 
    FROM customer_note 
    WHERE customer_id = 11 
) 
ORDER BY created_on 

ただし、INNER JOINを使用するときれいに見えます。 SQL :)の世界へ

0

ようこそ

まず、あなたは少しの調整ででし仕事を書き込もうとしたクエリ。

SELECT n.* 
FROM note n 
WHERE n.id IN (
    SELECT DISTINCT cn.note_id 
    FROM customer_note cn 
    WHERE cn.customer_id = 11 
) 

は...しかし、上記でしょう作品ながら、私はあなたがJOINのについての学習をするほうだと思います。特に、おそらく最も一般的なタイプの結合であり、この場合に必要なのはおそらく内部結合です。

SELECT n.* 
FROM note n 
JOIN customer_note cn 
ON  cn.note_id = n.id 
WHERE cn.customer_id = 11 

この構文は、読んで理解するのが自然であり、必要なものを正確に実行します。 JOINを使用して、2つのテーブル間にデカルト積(または「組み合わせ」)を生成することができます。テーブル定義のJOINの直後にあるONステートメントは、指定された条件でデカルト積をフィルタリングできます。この場合、customer_noteの表がノート「id」によってノートと整列するところに興味があります。最後に、WHEREステートメントを使用すると、特定のIDに対してcustomer_noteのエントリのみに基づいて選択することができます。

INNER-JOINは非常に一般的で、INNER JOINではなくJOINと言うことができます。これはほとんどの最新のSQLに共通しており、回線ノイズを低減します。)

結果をソートするように頼んだので、最後のクエリをさらに進めて、それを実行することができます。

SELECT n.* 
FROM  note n 
JOIN  customer_note cn 
ON  cn.note_id = n.id 
WHERE  cn.customer_id = 11 
ORDER BY n.note_date ASC 
関連する問題