2017-02-24 3 views
1

これらのテーブル構造を想像してみてリスト列

組織テーブル

===================== 
| id |  name  | 
-----+----------------+ 
| 1 | Organization 1 | 
===================== 

置きテーブル

================================= 
| id | name | organization_id | 
-----+----------+-----------------+ 
| 1 | Place 1 |  1  | 
-----+----------+-----------------+ 
| 2 | Place 2 |  1  | 
-----+----------+-----------------+ 
| 3 | Place 3 |  1  | 
================================= 

Profileテーブル

============= 
| username | 
-------------- 
| [email protected] | 
-------------- 
| [email protected] | 
============= 

Visitedplaceテーブル

================================================ 
| id | place_id | profile_username | visiteddate | 
-----+----------+---------------- -+-------------+ 
| 1 |  1 | [email protected] | 2017-01-01 | 
-----+----------+------------------+-------------+ 
| 2 |  2 | [email protected] | 2017-02-01 | 
-----+----------+------------------+-------------+ 
| 3 |  1 | [email protected] | 2017-01-15 | 
================================================ 

次は、テーブルを作成し、そこにデータを挿入するためのSQLたstatmentsです

-- ---------------------------- 
-- Table structure for organization 
-- ---------------------------- 
DROP TABLE IF EXISTS "organization"; 
CREATE TABLE "organization" (
"id" int4 NOT NULL, 
"name" varchar(255) COLLATE "default" NOT NULL 
) WITH (OIDS=FALSE); 
-- ---------------------------- 
-- Records of organization 
-- ---------------------------- 
BEGIN; 
INSERT INTO "organization" VALUES ('1', 'Organization 1'); 
COMMIT; 
-- ---------------------------- 
-- Table structure for place 
-- ---------------------------- 
DROP TABLE IF EXISTS "place"; 
CREATE TABLE "place" (
"id" int4 NOT NULL, 
"name" varchar(255) COLLATE "default" NOT NULL, 
"organization_id" int4 NOT NULL 
)WITH (OIDS=FALSE); 
-- ---------------------------- 
-- Records of place 
-- ---------------------------- 
BEGIN; 
INSERT INTO "place" VALUES ('1', 'Place 1', '1'); 
INSERT INTO "place" VALUES ('2', 'Place 2', '1'); 
INSERT INTO "place" VALUES ('3', 'Place 3', '1'); 
COMMIT; 
-- ---------------------------- 
-- Table structure for profile 
-- ---------------------------- 
DROP TABLE IF EXISTS "profile"; 
CREATE TABLE "profile" (
"username" varchar(255) COLLATE "default" NOT NULL 
)WITH (OIDS=FALSE); 
-- ---------------------------- 
-- Records of profile 
-- ---------------------------- 
BEGIN; 
INSERT INTO "profile" VALUES ('[email protected]'); 
INSERT INTO "profile" VALUES ('[email protected]'); 
COMMIT; 
-- ---------------------------- 
-- Table structure for visitedplace 
-- ---------------------------- 
DROP TABLE IF EXISTS "visitedplace"; 
CREATE TABLE "visitedplace" (
"id" int4 NOT NULL, 
"place_id" int4 NOT NULL, 
"profile_username" varchar(255) COLLATE "default" NOT NULL, 
"visiteddate" date NOT NULL 
)WITH (OIDS=FALSE); 
-- ---------------------------- 
-- Records of visitedplace 
-- ---------------------------- 
BEGIN; 
INSERT INTO "visitedplace" VALUES ('1', '1', '[email protected]', '2017-02-24'); 
COMMIT; 
-- ---------------------------- 
-- Alter Sequences Owned By 
-- ---------------------------- 
-- ---------------------------- 
-- Primary Key structure for table organization 
-- ---------------------------- 
ALTER TABLE "organization" ADD PRIMARY KEY ("id"); 
-- ---------------------------- 
-- Primary Key structure for table place 
-- ---------------------------- 
ALTER TABLE "place" ADD PRIMARY KEY ("id"); 
-- ---------------------------- 
-- Primary Key structure for table profile 
-- ---------------------------- 
ALTER TABLE "profile" ADD PRIMARY KEY ("username"); 
-- ---------------------------- 
-- Primary Key structure for table visitedplace 
-- ---------------------------- 
ALTER TABLE "visitedplace" ADD PRIMARY KEY ("id"); 
-- ---------------------------- 
-- Foreign Key structure for table "place" 
-- ---------------------------- 
ALTER TABLE "place" ADD FOREIGN KEY ("organization_id") REFERENCES 
"organization" ("id") ON DELETE CASCADE ON UPDATE CASCADE; 
------------------------------ 
-- Foreign Key structure for table "visitedplace" 
-- ---------------------------- 
ALTER TABLE "visitedplace" ADD FOREIGN KEY ("profile_username") REFERENCES "profile" ("username") ON DELETE CASCADE ON UPDATE CASCADE; 
ALTER TABLE "visitedplace" ADD FOREIGN KEY ("place_id") REFERENCES "place" ("id 

") ON DELETE CASCADE ON UPDATE CASCADE; 

私の質問です

私はこの次を実行

クエリ

select profile.username, count(distinct place.id) 
    from profile profile 
    left outer join visitedplace visitedplace on profile.username=visitedplace.profile_username 
    inner join place place on visitedplace.place_id=place.id 
    where place.organization_id=1 
    group by profile.username 

それは

===================== 
| username | count | 
-------------+------- 
| [email protected] | 2 | 
===================== 

次の結果を返しますが、私は

===================== 
| username | count | 
-------------+------- 
| [email protected] | 2 | 
-------------+------- 
| [email protected] | 0 | 
===================== 

次の結果を期待していますので、どのように私は、クエリは、私が期待していものを私に返すことができますか?私はPostgresの

+0

あなたは実際にそれらの(幾分)古いバージョンを使用していますか? –

+0

@a_horse_with_no_nameはURの質問を得ることができません、pls、thnxを明確にすることができます –

答えて

1

使用を使用しています

left joinを使用しています。したがって、すべての結合は外部結合(最初の結合の後)である必要があります。そして、あなたはwhere句に注意する必要があります:あなたが気をつけていない場合は

select p.username, count(distinct place.id) 
from profile p left outer join 
    visitedplace vp 
    on p.username = vp.profile_username left join 
    place pl 
    on vp.place_id = pl.id and pl.organization_id = 1 
group by p.username; 

、そして外側はinner joinにターンに参加します。

+0

はい、今働いて、感謝:) –