質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

471閲覧

外部キーで参照されていない末端のカテゴリーのみSELECTしたい

alpaka

総合スコア170

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2018/12/25 08:51

カテゴリーとサブカテゴリーを以下のようにして定義しています。
末端のカテゴリーのみSelectで全選択したいのですが、どのようなクエリをかけば実現可能でしょうか。

IDカテゴリー名親カテゴリーID
1動物null
2哺乳類1
3ネコ科2
4犬科2
5チワワ4
6ロシアンブルー3
7惑星null
8太陽系7
9地球8

↑の場合、外部キーとして参照されていない末端のチワワ、ロシアンブルー、地球だけをSELECTしたいです。

models.py

python

1class Category(models.Model): 2 category = models.CharField(verbose_name="Category", max_length=200, unique=True) 3 parent_id = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE) 4 register_time = models.DateTimeField(auto_now_add=True)

環境はDjango2.1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

SQL

1create table tbl(id int,cate varchar(20),p_cate int null); 2insert into tbl values 3(1,'動物',null), 4(2,'哺乳類',1), 5(3,'ネコ科',2), 6(4,'犬科',2), 7(5,'チワワ',4), 8(6,'ロシアンブルー',3), 9(7,'惑星',null), 10(8,'太陽系',7), 11(9,'地球',8);
  • 抽出

SQL

1select t1.cate from tbl as t1 2left join tbl as t2 on t1.id=t2.p_cate 3where t2.id is null 4

投稿2018/12/25 09:06

yambejp

総合スコア114777

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2018/12/25 09:08

こっちの方がコスト低そうですね。
alpaka

2018/12/27 00:27 編集

ご回答ありがとうございます。 いま、DjangoのORMでどのように実現するか検討してます。実現できましたら追記してクローズします。
guest

0

親カテゴリとして使用されていないデータを抽出すれば良いかと。

SQL

1select * from テーブル 2where id not in(select 親カテゴリーID from テーブル) 3 and 親カテゴリーID is not null

投稿2018/12/25 09:01

sazi

総合スコア25173

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

頂いた回答をもとに試行錯誤しておりましたが、クエリセットオブジェクトを取得できずなかなかうまく行きませんでした。(SQL自体はあっていますが、Djangoで応用しようとすると引っかかりました。)

スタックオーバーフローにも似た回答があり、以下のSQLでも良いそうです。
https://stackoverflow.com/questions/21943088/find-lowest-level-in-hierarchy

SQL

1SELECT id 2FROM Category 3EXCEPT 4SELECT parent_id 5FROM Category

上記SQLをDjangoのORM記述にしたところ、実現できました。

models.py

python

1class Category(models.Model): 2 category = models.CharField(verbose_name="Category", max_length=200, unique=True) 3 parent_id = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE) 4 register_time = models.DateTimeField(auto_now_add=True) 5 6 def select_lowest_level(self): 7 qs1 = Category.objects.values_list('id') #すべてのidを取得 <QuerySet [(1,), (2,), (3,), (4,), (5,), (6,), (7,), (8,), (9,)]> 8 qs2 = Category.objects.values_list('parent') #使われている親idを取得 <QuerySet [(None,), (1,), (2,), (2,), (4,), (3,),(None,), (7,), (8,)]> 9 qs3 = qs1.difference(qs2) #EXCEPTで差分のみ取得 <QuerySet [(3,), (4,), (9,)]> 10 id_list = [int(x[0]) for x in qs3] # idのリストに変換 [3, 4, 9] 11 cat = Category.objects.filter(id__in=id_list) #リストのIDに一致するものをSELECT 12 return cat # <QuerySet [<Category: ネコ科>, <Category: 犬科>, <Category: 地球>]>

投稿2018/12/27 01:29

編集2018/12/27 01:39
alpaka

総合スコア170

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問