webForumDet fria alternativet

JOIN? (Med fyra tabeller)

Databaser & SQLur Databashanterare & SQL

5 svar · 544 visningar · startad av MickeA.com

Medlem sedan feb. 20034 441 inlägg
Frågan#1

Hej,

Lite klurigt problem jag har dykt på. Har fyra tabeller med sektioner, typer, nivåer och grupper.
Nu ska jag skriva ut alla sektioner/typer som har en grupp, som är aktiv och inte markerad som borttagen.

Såhär ser min databas ut:

[b]tbl_section[/b]
section_id
section_name
section_removed

[b]tbl_type[/b]
type_id
type_parent ('relaterad' till section_id)
type_name
type_removed

[b]tbl_level[/b]
level_id
level_parent ('relaterad' till type_id)
level_name
level_removed

[b]tbl_group[/b]
group_id ('relaterad' till level_id)
group_parent
group_name
group_active
group_removed

Om [kolumn]_removed är 2 är den borttagen, så den ska vara 1 i alla tabeller.

Listan som jag vill skriva ut ska se ut såhär:

Sektion 1
  Typ 1_1
  Typ 1_2
  Typ 1_3

Sektion 2
  Typ 2_1
  Typ 2_2
  Typ 2_3

Hittills har jag kört en INNER JOIN på tbl_section och tbl_type, men jag måste även ha ett argument att _endast_ visa de sektioner/typer där det finns nivåer och dessa nivåer även innehåller _minst_ en öppen/ej raderad grupp.
Det som avgör om gruppen är aktiv är group_active och den ska vara 1.

Tacksam för hjälp, förstår inte hur jag ska reda det här när det är fyra tabeller att "hålla reda" på.

Tack!

/edit
DBMS är MySQL.
Sökte lite och hittade ett par trådar som jag ska kolla mer på..

Medlem sedan feb. 20034 441 inlägg
#2

Testade enligt ett exempel jag hittade:

SELECT 
a.section_id, a.section_name, a.section_name_int, 
b.type_id, b.type_parent, b.type_name, b.type_name_int, 
c.level_id, c.level_parent, 
d.group_id, d.group_parent, d.group_active 
FROM tbl_section a 
INNER JOIN (
	tbl_type b 
	LEFT OUTER JOIN (
					tbl_level c 
					RIGHT OUTER JOIN tbl_group d 
					ON d.group_parent = c.level_id
					) 
	ON c.level_parent = b.type_id
	) 
ON b.type_parent = a.section_id 
WHERE d.group_removed = 1 
AND group_active = 1

Men det blir inte ett enda rätt, verkar som om endast en typ från tbl_type hittas, vilket är fel.

Medlem sedan dec. 20025 483 inlägg
#3
select
	*
from
	tbl_section s inner join tbl_type t
	on
	s.section_id = t.type_parent and
	s.section_removed = 1 and
	t.type_removed = 1
where
	exists (select 1 from tbl_level l 
		inner join tbl_group g on l.level_id = g.group_parent and
		l.level_parent = t.type_id and
		l.level_removed = 1 and
		g.group_removed = 1 and
		g.group_active = 1)
Medlem sedan feb. 20034 441 inlägg
#4
[red][b]Unknown column 't.type_id' in 'on clause'[/b][/red]

SELECT * 
FROM tbl_section s INNER JOIN tbl_type t 
ON s.section_id = t.type_parent 
AND s.section_removed = 1 
AND t.type_removed = 1 
WHERE EXISTS 
		(
		SELECT 1 
		FROM tbl_level l INNER JOIN tbl_group g 
		ON l.level_id = g.group_parent 
		[b]AND l.level_parent = t.type_id [/b]
		AND l.level_removed = 1 
		AND g.group_removed = 1 
		AND g.group_active = 1
		)

Jag tror att det är den fetstilta raden ovan den gnäller men, men, det är konstigt, för t.type_id _är_ ett fält i den tabellen.

Medlem sedan dec. 20025 483 inlägg
#5

Om vi gör om lite grand då

SELECT * 
FROM tbl_section s INNER JOIN tbl_type t 
ON s.section_id = t.type_parent 
AND s.section_removed = 1 
AND t.type_removed = 1 
WHERE EXISTS 
		(
		SELECT 1 
		FROM tbl_level l INNER JOIN tbl_group g 
		ON l.level_id = g.group_parent 
		WHERE l.level_parent = t.type_id 
		AND l.level_removed = 1 
		AND g.group_removed = 1 
		AND g.group_active = 1
		)
Medlem sedan feb. 20034 441 inlägg
#6

Funkar fint, tack ska du ha!

264 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
134 ms — hämta forumlista (db)
124 ms — hämta statistik (db)
136 ms — hämta tråd, inlägg och bilagor (db)