Cookies op Tweakers

Tweakers maakt gebruik van cookies, onder andere om de website te analyseren, het gebruiksgemak te vergroten en advertenties te tonen. Door gebruik te maken van deze website, of door op 'Ga verder' te klikken, geef je toestemming voor het gebruik van cookies. Wil je meer informatie over cookies en hoe ze worden gebruikt, bekijk dan ons cookiebeleid.

Meer informatie
Toon posts:

[SQL] Hiërarchie attribuut maken op basis van ID en niveau

Pagina: 1
Acties:

Vraag


  • jdh009
  • Registratie: juni 2002
  • Laatst online: 22:02
Mijn vraag:
Mijn SQL kennis is beperkt tot de simpele SELECT, DELETE en UPDATE statements maar heb nog nooit echt gewerkt met vraagstukken die voorwaarden stellen/rekening houden met informatie buiten de eigen regel. Nu wil ik een nieuwe attribuut toevoegen die rekening houd en gebaseerd is op de regel(s) erboven.

ID/volgordetekstsoortniveau
1rootmap0
2mapnaam1map1
3mapnaam2map1
4bestandnaam1bestand2
5mapnaam3map1
6bestandnaam2bestand2


Dus:
ID/volgordetekstsoortniveaupath
1rootmap0root/
2mapnaam1map1root/mapnaam1/
3mapnaam2map1root/mapnaam2/
4bestandnaam1bestand2root/mapnaam2/
5mapnaam3map1root/mapnaam3/
6bestandnaam2bestand2root/mapnaam3/


In mijn hoofd klinkt dit vrij simpel maar krijg het dus niet voor elkaar om het in code om te zetten. Het is een soort CONCAT maar dan met een of meerdere waardes uit verschillende rows.

Relevante software en hardware die ik gebruik
MySQL

Wat ik al gevonden of geprobeerd heb
Ik heb gekeken of ik dit voorbeeld kon ombuigen naar een werkend alternatief voor mij maar ik mis de parent attribuut.

Mijn omslachtige manier die nog het meest in de buurt kwam van de oplossing was het dupliceren het attribuut "tekst" met het hoogste getal niveau + 1 (in dit gevak tekst1, tekst2,tekst3) de waarde van het verkeerde niveau eruit te gooien deze dan proberen samen te voegen met bovenstaande niveaus en dan een CONCAT uit te voeren. Waar ik dus nog mee bezig ben maar heel omslachtig werkt.

"Each event is preceded by Prophecy. But without the hero, there is no Event." - Zurin Arctus, the Underking

Alle reacties


  • RobIII
  • Registratie: december 2001
  • Laatst online: 00:20

RobIII

Admin Devschuur®

^ Romeinse 3 ja!

Wat je wil is een veld parent_id welke verwijst naar het (joh) parent id van dat record. Alle records (desnoods noem je het tuples of rows/rijen, niet "regels") welke daar de waarde null bevatten zijn root(s). Zet een foreign key naar het ID en klaar. Het queryen van zo'n model, afhankelijk van je eisen, brengt ook wel wat uitdagingen met zich mee maar is met moderne SQL en een fatsoenlijk RDBMs prima te doen. Vooral bij MySQL is 't behoorlijk afhankelijk van welke versie je gebruikt. Over het algemeen, in een modern RDBMS, kun je een "CTE" gebruiken (MySQL voorbeeld).

Niveau kun je schrappen (kun je afleiden, redundant dus) en path moet dus je parent worden:

idtekstsoortparent
1rootmap<null>
2mapnaam1map1
3mapnaam2map1
4bestandnaam1bestand3
5mapnaam3map1
6bestandnaam2bestand5

En "id/volgorde"-veld is ook een slecht plan; als je de volgorde wil wijzigen moet je niet 't ID hoeven aanpassen. Maak daar een los veld van alsjeblieft mits je zelf 'handmatig' de volgorde überhaupt wil kunnen bepalen; volgens mij wil je gewoon sorteren op naam en heel die volgorde dus ook overbodig/redundant. En voor "soort" zou ik een "enum" of type-tabel gebruiken (of een enkele char - M voor map, B voor bestand of "D" voor directory en "F" voor file - of een int: "1" voor map en "2" voor bestand of...); in ieder geval géén tekst; kost veel meer opslagruimte dan nodig.

idtekstsoortparent
1rootd<null>
2mapnaam1d1
3mapnaam2d1
4bestandnaam1f3
5mapnaam3d1
6bestandnaam2f5


Bovenstaand werkt in praktisch elk zichzelf respecterend RDBMS en kan zelfs zonder CTE's bevraagd worden (maar wat omslachtiger met bijv. self-joins). Maar je hebt ook RDBMS-specifieke oplossingen zoals dit bijvoorbeeld.

[Voor 97% gewijzigd door RobIII op 16-09-2020 16:50]

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

Roses are red Violets are blue, Unexpected ‘{‘ on line 32.

Over mij



Apple iPhone SE (2020) Microsoft Xbox Series X LG CX Google Pixel 4a CES 2020 Samsung Galaxy S20 4G Sony PlayStation 5 Nintendo Switch Lite

'14 '15 '16 '17 2018

Tweakers vormt samen met Hardware Info, AutoTrack, Gaspedaal.nl, Nationale Vacaturebank, Intermediair en Independer DPG Online Services B.V.
Alle rechten voorbehouden © 1998 - 2020 Hosting door True