login  Naam:   Wachtwoord: 
Registreer je!
 Forum

A en C verbonden?

Offline Frisbee - 24/12/2007 16:11 (laatste wijziging 24/12/2007 16:12)
Avatar van FrisbeeHTML beginner Sorry voor de onduidelijke titel, maar ik had echt geen idee hoe ik dit anders moest noemen :S

Ik heb ik m'n database een aantal punten die met elkaar verbonden kunnen zijn. Punt A is verbonden met B, punt B is verbonden met C enz..

In het bovenstaande voorbeeld is A dus ook via B met C verbonden. Wat is de makkelijkste manier om dit te checken?

Dit is een simpel voorbeeld maar in werkelijkheid zou het ook voor kunnen komen dat de verbinding over enorm veel punten loopt.

Ik hoop dat jullie iets van m'n vraag begrijpen 

Ik wil dus zo makkelijk mogelijk checken of A met C verbonden is, en dat mag dus ook via een ander punt.

9 antwoorden

Gesponsorde links
Offline Stijn - 24/12/2007 16:47
Avatar van Stijn PHP expert
  1. SELECT a.id FROM a INNER JOIN b INNER JOIN c ON (b.aid = a.id AND c.bid = b.id) WHERE a.id=1


Dit is een voorbeeld query. In de tabel A zit een id met de waarde 1. In tabel B staat het veld aid en zal de waarde 1 hebben en bijvoorbeeld is het id dan van B gelijk aan 102. Tabel C heeft een veld bid en is verbonden met het id van B, dus bid zal 102 hebben. De query zal kijken of er een link is van A -> B en een link van B -> C en dit aan de hand van een id uit tabel A.

Als je deze query uitvoert en het resultaat is 1 record dan heb je een link naar A -> C.
Offline Frisbee - 24/12/2007 17:50
Avatar van Frisbee HTML beginner Bedankt voor je reactie, maar dit is nog niet voldoende om het probleem op te lossen 

In het voorbeeld nam ik 3 punten maar het kunnen er ook 1000 worden. En dan wil ik snel kunnen checken of punt 324 verbonden is met 785 enz.. nogal lastig dus :S
Offline Wim - 24/12/2007 18:41
Avatar van Wim Crew algemeen
  1. SELECT COUNT(a.id)
  2. FROM a
  3. INNER JOIN b
  4. INNER JOIN c
  5. ON (a.punt = b.punt OR b.punt = c.punt OR a.punt = c.punt)
  6. WHERE a.punt=$punt OR b.punt=$punt OR c.punt=$punt


(where moet je nog wat uitbreiden)
Offline CDNC - 25/12/2007 11:56 (laatste wijziging 25/12/2007 11:56)
Avatar van CDNC PHP ver gevorderde
  1. SELECT
  2. COUNT(tableA.id) AS records,
  3. tableA.name AS mainName
  4. FROM
  5. tableNameA AS tableA,
  6. tableNameB AS tableB,
  7. tableNameC AS tableC
  8. WHERE
  9. tableA.id = $iInputID AND
  10. tableA.id = tableB.id AND
  11. tableB.id = tableC.id
  12. GROUP BY
  13. tableA.id


Ik heb het niet zo op joins staan.
Offline timmie_loots - 25/12/2007 12:53
Avatar van timmie_loots PHP gevorderde Frisbee, staan die punten in aparte tabellen, of staan ze allemaal in één tabel?

Als je wat meer uitleg zou geven over hoe de database in elkaar zit is het wat makkelijker reageren. Ze gaan er hier namelijk allemaal van uit dat je 3 tabellen hebt, maar misschien is dat wel helemaal niet zo.
Offline Rik - 25/12/2007 20:01 (laatste wijziging 25/12/2007 20:01)
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Ik dacht dat je bedoelde dat je één tabel hebt waar allemaal punten in staan en één tabel waar in staat welke punten met elkaar zijn verbonden.

Ik wil best proberen een query voor je te maken die het op die manier doet maar dan weet ik liever eerst precies wat het moet gaan doen.
Offline Frisbee - 28/12/2007 12:46 (laatste wijziging 28/12/2007 12:47)
Avatar van Frisbee HTML beginner Bedankt voor jullie reacties!

Ik heb inderdaad 2 tabellen. De eerste tabel staan de punten, in de andere welke met elkaar verbonden zijn. Zo bijvoorbeeld dus:

Punten:
punt
1
2
3
5
6
9
10
23
24

Verbindingen
punt1 - punt2
1 - 2
2 - 4
10 - 3
24 - 10
23 - 24

Nu wil ik aan de hand hiervan checken of bijvoorbeeld punt 1 verbonden is met punt 24. Het maakt niet uit verder hoeveel verbindingen er tussen zitten. Alleen of ze verbonden zijn.
Offline Rik - 28/12/2007 20:59
Avatar van Rik Gouden medailleGouden medaille

Crew algemeen
Het is waarschijnlijk niet de meest efficiënte manier, maar het werkt wel:
  1. function isConnected($begin, $end) {
  2. $result = mysql_query('SELECT `beginpunt_id`, `eindpunt_id` FROM `verbindingen`');
  3. $data = array();
  4. while ($row = mysql_fetch_row($result)) {
  5. $min = min($row);
  6. $max = max($row);
  7. $data[$min][] = $max;
  8. }
  9. if (isset($data[$begin])) {
  10. $stack[] = $data[$begin];
  11. while (count($stack) > 0) {
  12. $bondings = array_shift($stack);
  13. foreach (array_unique($bondings) as $bonding) {
  14. if ($bonding == $end) {
  15. return true;
  16. } elseif (isset($data[$bonding])) {
  17. $stack[] = $data[$bonding];
  18. }
  19. }
  20. }
  21. }
  22. return false;
  23. }


Met de volgende tabellen:
  1. CREATE TABLE `punten` (
  2. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  3. PRIMARY KEY (`id`)
  4. ) ENGINE=InnoDB AUTO_INCREMENT=1238 DEFAULT CHARSET=utf8;
  5.  
  6. CREATE TABLE `verbindingen` (
  7. `id` smallint(6) NOT NULL AUTO_INCREMENT,
  8. `beginpunt_id` smallint(6) DEFAULT NULL,
  9. `eindpunt_id` smallint(6) DEFAULT NULL,
  10. PRIMARY KEY (`id`)
  11. ) ENGINE=InnoDB AUTO_INCREMENT=3004 DEFAULT CHARSET=utf8;


Ik heb de punten 1 tot 1000 in de eerste tabel gezet en random zo'n 4000 verbindingen aangemaakt. Het script draait dan nog niet eens zo heel erg langzaam!  

Het beste zou zijn om zoiets in een procedure van mysql te doen, maar dat snap ik nog niet goed genoeg.  
Offline Frisbee - 29/12/2007 15:31
Avatar van Frisbee HTML beginner Heel erg bedankt Hier heb ik wat aan 

Ik hoopte dat er een oplossing zou zijn waarbij ik alleen een query nodig had, maar ik ben bang dat dat gewoon niet mogelijk is 
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.217s