У меня три таблицы:
категории:
|Id | TopId|
| 1 | null |
| 2 | null |
| 3 | 1 |
| 4 | 1 |
| 5 | 2 |
| 6 | 3 |
так далее...
categorycultures:
|Id|CultureOf|CultureId|Name |
|1 | 1 | 1 |Category 1|
|2 | 1 | 2 |Klasse 1|
|3 | 1 | 3 |Kategori 1|
|4 | 2 | 1 |Category 2|
|5 | 2 | 2 |Klasse 2|
|6 | 2 | 3 |Kategori 2|
CultureOf также означает: CategoryId и т.д....
культуры:
|Id|Name|Flag |
|1 |en |/images/en.png|
|2 |de |/images/de.png|
|3 |tr |/images/tr.png|
и этот sql-скрипт получает то, что мне нужно, но без нулевых вершин.
select c.Id as Id, cp.Id as TopId, cc.Name as Name, ccp.Name as TopName, cul.Id as CultureId, cul.Name as CultureName
from categories as c
inner join categories as cp on c.TopId = cp.Id
inner join categorycultures as cc on cc.CultureOf = c.Id
inner join categorycultures as ccp on ccp.CultureOf = cp.Id
inner join cultures as cul on cul.Id = cc.CultureId and cul.Id = ccp.CultureId
where cul.Id = 2
результаты:
есть недостающие строки, которые имеют значения TopId равны нулю
Я пробовал много случаев, когда серия на внутреннем соединении для cp и пробовала много скриптов, но я не могу получить правильные значения.
Это сработало. но я ничего не узнал. Я скопирую и вставлю в следующий раз, когда мне это понадобится.
select c.Id as Id, c.TopId as TopId, cc.Name as Name, CASE
WHEN c.TopId is null THEN "none"
ELSE ccp.Name
END as TopName, cul.Id as CultureId, cul.Name as CultureName
from categories as c
left join categories as cp on CASE
WHEN c.TopId is null THEN "null"
ELSE c.TopId = cp.Id
END
inner join categorycultures as cc on cc.CultureOf = c.Id
left join categorycultures as ccp on ccp.CultureOf = cp.Id
left outer join cultures as cul on cul.Id = cc.CultureId and CASE
WHEN c.TopId is null THEN 1
ELSE cul.Id = ccp.CultureId
END
where cul.Id = 1
попробуй это
RIGHT объединяет культуры как cul