私は3つのテーブルを持っています:
CREATE TABLE category (id integer, parent_id integer);
CREATE TABLE category_name (id integer, name (varchar(20), language_id);
CREATE TABLE language (language_id integer, language_name);
私は次のステートメントで子供-親-祖父母の関係を得ることができます:
SELECT c.id, c.parent_id, p.parent_id
FROM category AS p, category AS c
WHERE p.id = c.parent_id AND p.parent_id IS NOT NULL;
ただし、language_id = 3のテーブルcategory_nameから、子、親、祖父母の両方の名前も取得する必要があります。
子-親-祖父母の関係なしで名前を取得するためのクエリは、次のようになります。
SELECT c.id, n.name
FROM category c
LEFT JOIN category_name n ON c.id = n.id AND language_ID = 3
しかし、2つのステートメントを1つに結合して、実際に3つの名前列を取得するにはどうすればよいでしょうか。つまり、各行には、それ自体、その親、およびその祖父母(後者が存在する場合)のIDと名前が必要です。
この結合されたクエリを作成するにはどうすればよいですか?
表といくつかのサンプルデータは次のとおりです。
CREATE TABLE category (id integer, parent_id integer);
INSERT INTO category VALUES (1,null);
INSERT INTO category VALUES (2,null);
INSERT INTO category VALUES (3,1);
INSERT INTO category VALUES (4,2);
INSERT INTO category VALUES (5,2);
INSERT INTO category VALUES (6,4);
INSERT INTO category VALUES (7,2);
INSERT INTO category VALUES (8,7);
INSERT INTO category VALUES (9,7);
INSERT INTO category VALUES (10,7);
INSERT INTO category VALUES (11,3);
CREATE TABLE category_name (id integer, name varchar(20), language_id integer);
INSERT INTO category_name VALUES (1, 'CDs', 3);
INSERT INTO category_name VALUES (2, 'Books', 3);
INSERT INTO category_name VALUES (3, 'Music', 3);
INSERT INTO category_name VALUES (4, 'Novels', 3);
INSERT INTO category_name VALUES (5, 'Childrens books', 3);
INSERT INTO category_name VALUES (6, 'European', 3);
INSERT INTO category_name VALUES (7, 'Science', 3);
INSERT INTO category_name VALUES (8, 'Math', 3);
INSERT INTO category_name VALUES (9, 'Informatics', 3);
INSERT INTO category_name VALUES (10, 'Physics', 3);
INSERT INTO category_name VALUES (11, 'Classic', 3);
INSERT INTO category_name VALUES (1, 'CDs', 4);
INSERT INTO category_name VALUES (2, 'Livres', 4);
INSERT INTO category_name VALUES (3, 'Musique', 4);
INSERT INTO category_name VALUES (4, 'Romans', 4);
CREATE TABLE language (language_id integer, language_name varchar(15));
INSERT INTO language (3, 'English');
INSERT INTO language (4, 'French');
サンプルを取得する方法は次のとおりです(c.id = 5および8の場合)。
c.id | c.parent_id | p.parent_id | nameChild | nameParent | nameGrandparent
5 | 2 | null | 'Children's books' | 'Books' | null
8 | 7 | 2 | 'Math' | 'Science' | 'Books'
次のコードを試しましたが、エラーコードが表示されます:1054。「on句」の不明な列「p.parent_id」
SELECT c.id, c.parent_id, p.parent_id, nc.name, np.name, ng.name
FROM category1 AS p, category1 AS c
LEFT JOIN category_name1 AS nc ON c.id = nc.id AND nc.language_id = 3
LEFT JOIN category_name1 AS np ON c.parent_id = np.id AND np.language_id = 3
LEFT JOIN category_name1 AS ng ON p.parent_id = ng.id AND ng.language_id = 3 AND p.parent_id IS NOT NULL
WHERE p.id = c.parent_id AND p.parent_id IS NOT NULL;
子と親の名前を取得するのに問題はありませんが、祖父母の名前は私の理解できないようです:(
そして、以下は動作するコードです!
SELECT x.id, x.pid, x.gpid,
nc.name childName, np.name parentName, ng.name gpName
FROM
(SELECT c.id , c.parent_id AS pid, p.parent_id AS gpid
FROM
category AS c
LEFT JOIN category AS p ON p.id = c.parent_id
) x
LEFT JOIN category_name AS nc ON x.id = nc.id AND nc.language_id = 3
LEFT JOIN category_name AS np ON x.pid = np.id AND np.language_id = 3
LEFT JOIN category_name AS ng ON x.gpid = ng.id AND ng.language_id = 3;