[SQL] dubbele join uitvoeren.

Pagina: 1
Acties:
  • 277 views sinds 30-01-2008
  • Reageer

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 07-02 09:48

TrailBlazer

Karnemelk FTW

Topicstarter
Ik ben bezig om firewall rules in mysql vast te leggen. Nu heb ik twee tabellen gemaakt. In de ene tabel heb ik de rules gemaakt. Hierin heeft elk het destination en source subnet een id die verwijst naar een uniek subnet in de andere tabel.
Ik heb dus geen aparate tabellen gemaakt voor de dest en source subnets.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
mysql> describe rules;
+------------------+------------------+------+-----+---------+----------------+
| Field            | Type             | Null | Key | Default | Extra          |
+------------------+------------------+------+-----+---------+----------------+
| ruleid           | int(10) unsigned |      | PRI | NULL    | auto_increment |
| name             | varchar(255)     | YES  |     | NULL    |                |
| source_subnet_id | int(10) unsigned | YES  |     | NULL    |                |
| dest_subnet_id   | int(10) unsigned | YES  |     | NULL    |                |
| chain_id         | int(10) unsigned | YES  |     | NULL    |                |
+------------------+------------------+------+-----+---------+----------------+
5 rows in set (0.00 sec)

mysql> describe subnets;
+----------+------------------+------+-----+---------+----------------+
| Field    | Type             | Null | Key | Default | Extra          |
+----------+------------------+------+-----+---------+----------------+
| subnetid | int(10) unsigned |      | PRI | NULL    | auto_increment |
| name     | varchar(255)     | YES  |     | NULL    |                |
| ip       | varchar(15)      | YES  |     | NULL    |                |
| subnet   | varchar(15)      | YES  |     | NULL    |                |
+----------+------------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql>

nu wil ik graag een join maken die dus het source en destiniation subnet uit de database haalt.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
mysql> select * from rules;
+--------+--------------------+------------------+----------------+----------+
| ruleid | name               | source_subnet_id | dest_subnet_id | chain_id |
+--------+--------------------+------------------+----------------+----------+
|      1 | Forwarding allowed |                1 |              2 |        3 |
+--------+--------------------+------------------+----------------+----------+
1 row in set (0.00 sec)

mysql> select * from subnets;
+----------+---------------+-------------+---------------+
| subnetid | name          | ip          | subnet        |
+----------+---------------+-------------+---------------+
|        1 | Local network | 192.168.0.0 | 255.255.255.0 |
|        2 | The World     | 0.0.0.0     | 0.0.0.0       |
+----------+---------------+-------------+---------------+
2 rows in set (0.00 sec)

mysql>

ik wil dus een query maken die zowel het source en destinatin subnet laat zien. Als ik echter de volgende query maak.
select * from rules,subnets where rules.source_subnet_id = subnets.subnetid and rules.dest_subnet_id = subnets.subnetid;
krijg ik een empty set terug.

ik heb al wel gekeken naar left en right joins maar ik begrijp ze niet helemaal kan iemand me de goede richting op helpen

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:07

Creepy

Tactical Espionage Splatterer

Probeer eerst eens een join te doen voor alleen het source subnet (zie bijv. ook de SQL FAQ waar alle joins netjes worden uitgelegd). Als dat lukt dan maak je een tweede join met dezelfde tabel voor het destination subnet.

Dat je nu een empty set terugkrijg is vrij logisch aangezien je nu de zaken opzoekt waarbij zowel source als destination hetzelfde subnet zijn.

Edit: ja, ik was te lui om dat linkje op te zoeken :P * Creepy aait RobIII

[ Voor 34% gewijzigd door Creepy op 06-09-2006 12:13 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


  • DemonTPx
  • Registratie: December 2002
  • Laatst online: 05-12-2025
zoiets?

SQL:
1
2
3
4
SELECT * FROM rules r
 JOIN subnets d_s ON (r.dest_subnet_id = d_s.id)
 JOIN subnets s_s ON (r.source_subnet_id = s_s.id)
 WHERE ...;

  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 07-02 09:48

TrailBlazer

Karnemelk FTW

Topicstarter
ok die laatste lijkt te werken. Ik ga hem nu proberen te begrijpen.

  • DemonTPx
  • Registratie: December 2002
  • Laatst online: 05-12-2025
Dit was jou query:
SQL:
1
2
SELECT * FROM rules, subnets
 WHERE rules.source_subnet_id = subnets.subnetid AND rules.dest_subnet_id = subnets.subnetid;


De reden waarom dat niet werkt, is omdat hij bij de vergelijking achter WHERE, maar één record gebruikt. Dus hij zou kunnen zoeken naar een record waar id 1 en 2 is. Hij zou dus alleen wat terug geven als dest_subnet_id en source_subnet_id hetzelfde waren geweest.

De query van mij werkt goed, omdat hij twee maal subnets laat joinen. En elke keer onder een andere naam (d_s en s_s).
Maar het hat bijvoorbeeld ook zo gekunt:
SQL:
1
2
SELECT * FROM rules r, subnets d_s, subnets s_s
 WHERE r.dest_subnet_id = d_s.id AND r.source_subnet_id = s_s.id;


...maar persoonlijk vind ik JOIN's mooier :)

Verwijderd

Probeer anders eens UNION SELECT ipv JOIN wanneer dit niet werkt

  • Annie
  • Registratie: Juni 1999
  • Laatst online: 25-11-2021

Annie

amateur megalomaan

Verwijderd schreef op woensdag 06 september 2006 @ 13:09:
Probeer anders eens UNION SELECT ipv JOIN wanneer dit niet werkt
1. de JOIN werkt.
2. een UNION doet iets heel anders en daar heeft de topicstarter niets aan bij zijn probleem.

Dus ik snap je bijdrage niet helemaal.

Today's subliminal thought is:


  • TrailBlazer
  • Registratie: Oktober 2000
  • Laatst online: 07-02 09:48

TrailBlazer

Karnemelk FTW

Topicstarter
Ok ik heb nu dus deze gemaakt en deze geeft de goede items terug.
SQL:
1
select s_s.ip,s_s.subnet,d_s.ip,d_s.subnet from rules r join subnets d_s on r.dest_subnet_id=d_s.subnetid join subnets s_s on r.source_subnet_id=s_s.subnetid;

Ik wist niet dat je alliasen (heet dit zo) van een tabel kon maken.

  • DemonTPx
  • Registratie: December 2002
  • Laatst online: 05-12-2025
mja.. dat zijn aliasses.. je zou er ook nog (als je het echt netjes wilt doen) een AS tussen kunnen zetten.. dus: FROM rules AS r, of: JOIN subnets AS s_s
Pagina: 1