[mysql] results uit meerdere tabellen maar niet altijd

Pagina: 1
Acties:

  • js303
  • Registratie: April 2003
  • Laatst online: 01-08 22:19
een beginnersvraag wellicht, echter ik kom er niet uit.
ik heb 3 tabellen:

tabel 1: persons
tabel 2: projects
tabel 3: files

m'n query ziet er als volgt uit:
SELECT persons.name, projects.name, files.name
FROM persons, projects, files
WHERE persons.person_id = projects.person_id
AND projects.project_id = files.project_id
ORDER BY projects.priority ASC, files.priority ASC

aan 1 persoonskaart (in tabel persons) kunnen meerdere projecten hangen (kaarten in tabel projects) en een project kan uit 1 of meerdere files bestaan (kaarten in tabel files). dit werkt prima - iaw ik krijg results - zolang van elke persoon die ik wil opvragen ook tenminste 1 project en per project tenminste 1 file bestaat. echter er zijn situaties waarin nog geen project aan de persoon gekoppeld is of nog geen files aan het project vastzitten. effect is dat ik helemaal geen geen result van deze persoon terugkrijg, terwijl ik op z'n minst de persoonsgegevens uit de tabel persons wil terugkrijgen. momenteel los ik dit probleem op door er altijd voor te zorgen dat bij het aanmaken van een nieuwe persoon ook 1 nieuw project wordt aangemaakt en voor ieder nieuw project 1 nieuwe file. maar dat is erg lelijk en genereert een hoop overbodige records.

hoe kan ik de query veranderen zodat ik altijd de persoonsdata krijg en - indien die er zijn - de projecten en - indien die er ook zijn - de files aan die projecten?

ik heb in de mysql manual lopen zoeken, en heb een vermoeden dat ik iets met een subselect moet doen. onze mysql server zit op 3.23, die ondersteunt dus geen subselects .

  • Kaastosti
  • Registratie: Juni 2000
  • Laatst online: 10:27

Kaastosti

Vrolijkheid alom!

In dat geval kun je van tevoren misschien checken of die dingen er zijn. Ik ben geen sql-guru, maar als je eerst alleen projecten selecteerd bij een persoon en dan checkt of daar records in zitten. Daarna hetzelde voor files...

Dan heb je ze ook volgens mij, alhoewel je dan wel meerdere queries krijgt.

Een vergissing is menselijk, maar om er echt een puinhoop van te maken heb je een computer nodig.


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Je zult een OUTER (ook wel LEFT of RIGHT join genoemd) moeten gebruiken ipv een gewone (INNER) join.
Sla je MySQL doc's er eens op na over hoe je dat precies doet.

https://fgheysels.github.io/


  • pjonk
  • Registratie: November 2000
  • Laatst online: 29-12-2025
Je moet met JOINS gaan werken en wel OUTER JOINS.

code:
1
2
3
4
5
SELECT persons.name, projects.name, files.name
FROM persons, projects, files
OUTER JOIN projects ON (persons.person_id = projects.person_id)
OUTER JOIN projects ON (project_id = files.project_id)
ORDER BY projects.priority ASC, files.priority ASC

OUTER JOINS joinen 2 tabellen altijd ook als de foreign key niet vookomt in 1 van de gejoinde tabellen. De velden uit de gejoinde tabel die je dan terugkrijgt hebben dan een NULL waarde

It’s nice to be important but it’s more important to be nice


  • twiekert
  • Registratie: Februari 2001
  • Laatst online: 10:45


bah, ik ben te traag....

je zal de tabellen moeten joinen :)

http://www.mysql.com/doc/en/JOIN.html

dus ... FROM persons LEFT JOIN projects ON persons.person_id = projects.person_id
en hetzelfde voor de files

[ Voor 13% gewijzigd door twiekert op 10-07-2003 10:41 ]


  • js303
  • Registratie: April 2003
  • Laatst online: 01-08 22:19
te gek tweakers, het werkt! nou daar was ik echt niet achter gekomen uit de mysql handleiding alleen. ik vind die manual sowieso niet echt ontzettend helpvol voor beginners. het is echt een reference. magoed dit werkt dus goed:

SELECT *
FROM bb2_items it
LEFT JOIN bb2_projects_items AS rel ON (it.item_id = rel.item_id)
LEFT JOIN bb2_projects AS proj ON (rel.project_id = proj.project_id)
LEFT JOIN bb2_files AS fil ON (proj.project_id = fil.project_id)


ik weet het * is niet echt slim maar heb ik nu even voor debuggen gebruikt. dat ga ik vervangen door de velden die ik echt nodig heb.
code:
1
2
3
4
5
SELECT persons.name, projects.name, files.name
FROM persons, projects, files
OUTER JOIN projects ON (persons.person_id = projects.person_id)
OUTER JOIN projects ON (project_id = files.project_id)
ORDER BY projects.priority ASC, files.priority ASC
de fout die ik overigens nog maakte (en jonkieXL ook niet opmerkte) is om in de FROM alle tabellen op te nemen... dat moet je dus niet doen! gelukkig stond dit wel in de mysql manual.

iig bedankt voor jullie aanzet. zonder jullie had het me een stuk meer tijd gekost!
Pagina: 1