[SQL] Tabellen combineren met wisselende resultaten

Pagina: 1
Acties:

  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 10:14
Ik zit met de volgende combinatie tabellen:
job: bevat een primary key "jobID" en wat info per regel
device: bevat een primary key "deviceID" en wat info per regel
uses: bevat een jobID en een deviceID per regel.

de werking lijkt me redelijk simpel. Nu heb ik een query die alle jobs ophaalt tussen 2 data die door de gebruiker ingevoerd kunnen worden. Als vanzelfsprekend wil ik dat de naam van het device afgedrukt wordt, in plaats van het ID. Dit is uiteraard makkelijk op te lossen door van verschillende query's gebruik te maken, maar ik vraag me af of het ook in 1 keer kan?
Gebruik maken van JOINS is dan het juiste antwoord, maar dan krijg je elke keer dat er een regel in uses voorkomt een regel met exact dezelfde info, behalve dan het deviceID dat veranderd. Bestaat er een manier om aan MySQL aan te geven dat hij de resultaten van 1 bepaalde kolom moet combineren (liefst nog met een newline)

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:25
SQL is er om je resultaten op te halen; de layout daarvan moet je niet door SQL laten oplossen, daar is het niet voor bedoeld.
Gebruik PHP / Delphi / C# / whatever voor die layout te verzorgen.

https://fgheysels.github.io/


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 10:14
Dat weet ik, maar mijn probleem is dat ik dan per job ook nog eens de device-naam op moet gaan halen. En aangezien het hier niet alleen om devices maar ook om mensen en transport gaat betekend dat een aantal query's extra per job, en dat lijkt me zo onefficient.

  • whoami
  • Registratie: December 2000
  • Laatst online: 16:25
:?
Je kan toch met 1 query alle gegevens ophalen, en dan zorg je er gewoon voor dat ze in de gewenste lay-out getoond worden in je applicatie

https://fgheysels.github.io/


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 10:14
Nee, wanneer een bepaalde jobID meerdere keren voorkomt in de uses tabel krijg ik dus ook meerdere resultaatrijen, en daar heb ik niks aan aangezien ik elke JOB maar 1 keer af wil beelden. Dan zou ik in PHP weer moeten gaan filteren en moeilijk doen nietwaar?

of ik kijk echt iets enorm over t hoofd, kan ook

[ Voor 10% gewijzigd door jsiegmund op 28-04-2004 14:48 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 16:25
Ik zeg toch dat je die dubbele dan maar door je PHP scriptje laten verdwijnen? Er is geen andere mogelijkheid, tenzij je een UDF zou schrijven (wat niet mogelijk is in mySql) en je genoegen neemt dat alle jobs dan naast elkaar staan ipv onder elkaar.

Doe het gewoon zo:
code:
1
2
3
4
select jobid, job, deviceid, device
from job, device
where device.jobid = job.jobid
ORDER BY jobid , job


En dan ga je met je loopje in je PHP door alle rows, en pas als jobid een andere waarde heeft als het vorige record, moet je de job - informatie afdrukken.
Ik heb hier ooit eens een voorbeeldje ervan gemaakt in pseudo-code, maar dat is eigenlijk basic programma structuren / data-structuren.

https://fgheysels.github.io/


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Denk nog eens goed na over wat je op wilt halen.
Aan de ene kant wil je 1 rij per job, maar een job kan wel meerdere devices hebben en je wilt wel een device laten zien.
Moet dat het eerste device zijn? een willekeurige? etc.

Who is John Galt?


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ik denk dat je inderdaad wat over het hoofd ziet. Wat jij wil, is iets wat SQL niet ondersteunt en dat hoeft ook niet, want daar is het niet voor bedoeld.

Als je in php bijhoudt wat je previous job was, kun je daar toch bepalen of je het wel of niet wilt tonen.

Of je moet inderdaad per job de uses op gaan halen, maar dat is errruuug slecht voor je performance.

[ Voor 17% gewijzigd door cameodski op 28-04-2004 14:54 ]

Never underestimate the power of


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:01

Janoz

Moderator Devschuur®

!litemod

Als je jobID in meerdere records voorkomt betekend dit waarschijnlijk dat er meerdere devices bij zitten. Als je slechts 1 regel wilt zul je moeten bepalen hoe je de verschillende devices samen gaat nemen (en nee, je kunt ze niet achter elkaar zetten).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


  • jsiegmund
  • Registratie: Januari 2002
  • Laatst online: 10:14
Okay die reactie van Janoz is inderdaad waar ik mee zit, en dat achter elkaar zetten niet lukte vermoedde ik al. Maar wat heb je dan nog meer voor opties?
Ik vraag me gewoon af wat efficienter is: het 3x uitvoeren van een query om devices, people etc nog eens op te halen, of meerdere rijen resultaat en daar in PHP de verschillende dingen uit zien te filteren. Allebei is het niet echt moeilijk, maar met de oog op een redelijk groot systeem wilde ik het een en ander zo snel mogelijk proberen te houden.

  • Krul
  • Registratie: November 2000
  • Laatst online: 30-04 20:33

Krul

Holodoc

Gebruik een Group by voor de kolom die meerdere devices per user (or whatever) bevat.
Natuurlijk kan je ook met een distinct een heel end komen. Zoek even na in een goede SQL manual... (8>
Pagina: 1