2016-07-08 5 views
-2

私はまだ初心者です。postgresqlでクエリを書くには? (多対多の関係)

DROP DATABASE IF EXISTS image_store_db; 
CREATE DATABASE image_store_db; 

\c image_store_db; 

CREATE TABLE categories_images (
    categories_images_id SERIAL PRIMARY KEY, 
    title VARCHAR NOT NULL, 
    image_url VARCHAR NOT NULL, 
    design_url VARCHAR NOT NULL 
); 

CREATE TABLE images (
    images_id SERIAL PRIMARY KEY, 
    title VARCHAR NOT NULL, 
    rating REAL NOT NULL, 
    image_url VARCHAR NOT NULL, 
    desc_short TEXT NOT NULL, 
    desc_full TEXT NOT NULL 
); 

CREATE TABLE ref_categories_images (
    categories_images_id integer REFERENCES categories_images (categories_images_id) ON UPDATE CASCADE, 
    images_id integer REFERENCES images (images_id) ON UPDATE CASCADE ON DELETE CASCADE, 
    CONSTRAINT ref_categories_images_pkey PRIMARY KEY (images_id, categories_images_id) 
); 

INSERT INTO categories_images(title, image_url, design_url) 
    VALUES ('SIMPLE TITLE TEST', '/TEST_URL.PNG', '/TEST_URL.PNG'); 

INSERT INTO images(title, rating, image_url, desc_short, desc_full) 
    VALUES ('SIMPLE TITLE TEST', 4.5, '/TEST_URL.PNG', 'TEST_SHORT', 'TEST_FULL'); 

Plsは、ヘルプ: は、私はこのようなDBを作成しました。教えて、クエリを作成する方法:

+0

https://www.postgresql.org/docs/current/static/tutorial-populate.htmlおよびhttps://www.postgresql.org/docs/current/static/tutorial-select.htmlおよびhttps:/ /www.postgresql.org/docs/current/static/tutorial-join.html –

答えて

0

私の答えはcategories_imagesカテゴリのテーブルで、imagesがあることを前提としてい...等... PLS(カテゴリーのイメージのために)挿入し、(カテゴリIDからの画像)を選択し、画像のテーブルテーブルと属性の名前は、多対多の結合の概念が皆さんにはまだ明確ではないことを示唆しているようです。私は3つのテーブルをcategoryimagecategory_image_mapと呼んでいたでしょう。

INSERTの場合:問題がserial主キーの場合は、INSERT ... RETURNINGを使用してください。
あなたは、単一のステートメント内のすべての3つのテーブルに挿入することができます:あなただけの3つのテーブルに参加、クエリのために

WITH im(im_id) AS (
     INSERT INTO categories_images ... 
      RETURNING categories_images_id 
    ), 
    cat(cat_id) AS (
     INSERT INTO images ... 
      RETURNING images_id 
    ) 
INSERT INTO ref_categories_images (categories_images_id, images_id) 
    VALUES ((SELECT cat_id FROM cat), (SELECT im_id FROM im)); 

SELECT ... 
FROM categories_images c 
    JOIN ref_categories_images r 
     ON r.categories_images_id = c.categories_images_id 
    JOIN images i 
     ON r.images_id = i.images_id 

をし、例えば、あなたの状態のためWHERE句を追加

WHERE c.categories_images_id = 42 

または

WHERE i.image_title = 'Mona Lisa' 
+0

O !!私は十分にあなたに感謝できない!どうもありがとうございます! –