首先,如果标题与问题不符,请道歉。好吧,问题是如何构建这个查询...
我有一张名为category
的表格。它包含我的东西(电影)类别。就像这样...
--------------------------------
ID | name | parent_category
--------------------------------
1 | love | 0
2 | action | 0
3 | fear | 0
4 | passion| 1
5 | danger | 2
6 | death | 3
--------------------------------
因此,如您所见,每个类别都有一个父类别。除了前三个。他们是父母。
电影表就是这样......
--------------------------------
ID | name | category
--------------------------------
1 | aaaa | 1
2 | bbbbbb | 2
3 | cccc | 2
4 | ddddddd| 1
5 | eeeeee | 3
6 | fffff | 3
--------------------------------
所以,我想做的是,按父类别选择电影。这意味着如果我点击类别love
,它应该选择所有以love
作为父类别的类别的电影。
那么,如何在单个查询中编写它?
答案 0 :(得分:1)
如果父母只有一个级别,那么您可以使用join
s:
select m.*,
coalesce(cp.id, c.id) as parent_id,
coalesce(cp.name, c.name) as parent_name
from movies m left join
categories c
on m.category = c.id left join
categories cp
on c.parent_category = cp.id;
实际上,如果您只想要id
,则不需要两个联接:
select m.*,
(case when c.parent_id > 0 then c.parent_id else c.id end) as parent_id
from movies m left join
categories c
on m.category = c.id ;
或者更简单:
select m.*, greatest(c.parent_id, c.id) as parent_id
. . .
答案 1 :(得分:1)
选择在secend表上按条件过滤的行使用FROM子句中的join或具有IN或EXISTS函数的条件子查询。要将字段与某个字符串进行比较,可以使用LIKE运算符。
答案 2 :(得分:1)
如果您基于parent_category进行过滤 -
SELECT b.*, a.name FROM movies b
LEFT JOIN categories a ON a.id = b.category
WHERE a.parent_category = 1;