Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySQL] Records ophalen waaraan niks gekoppeld is

Pagina: 1
Acties:

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Ik heb dus twee tabellen: Uren en Project waarin de Uren-tabeleen field heeft genaamd ProjectID, welke logischerwijs verwijst naar het ID van het project.

Nu wil het geval zo zijn dat er ooit eens een paar projecten verwijderd zijn en er dus uren zijn met een projectID, maar waar dus geen project meer aan vast zit. Is het mogelijk hier een lijst van te krijgen? Ik kan wel joins werken, maar dan krijg ik alleen de records waar wel een project aan vast zit.

Iemand tips?

EDIT: Wacht, met left join kom ik natuurlijk al een end...hoef ik alleen maar de records eruit te vissen waar geen project-info bij zit.

[ Voor 12% gewijzigd door armageddon_2k1 op 23-07-2007 11:33 ]

Engineering is like Tetris. Succes disappears and errors accumulate.


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Twee zelfs:


1) Een (versie van een) database gebruiken met ondersteuning voor foreign keys

2)
SQL:
1
2
3
4
SELECT * 
FROM Uren 
LEFT OUTER JOIN Project ON Uren.ProjectId = Project.ProjectId 
WHERE Project.ProjectId IS NULL

Oops! Google Chrome could not find www.rijks%20museum.nl


  • Motrax
  • Registratie: Februari 2004
  • Niet online

Motrax

Profileert

Maak een outer join tussen Uren en Project in plaats van een normale join en vraag dan de NULL velden op van Project.ID.

Op deze manier kan je ook in hele grote data selecties een != voorkomen, soms qua performance handiger.

Of gewoon een != vergelijking maken:
Select * from Uren
Where Uren.ProjectID != Project.ID

Grrr P_de_B :P

☻/
/▌
/ \ Analyseert | Modelleert | Valideert | Solliciteert | Generaliseert | Procrastineert | Epibreert |


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Motrax schreef op maandag 23 juli 2007 @ 11:34:
Of gewoon een != vergelijking maken:
Select * from Uren
Where Uren.ProjectID != Project.ID
Als je die es zelf probeert... levert je een mooie combinatorische explosie op. Maar het is wel bijna goed ;)

SQL:
1
2
3
4
5
6
7
SELECT * FROM Uren
WHERE Uren.ProjectID NOT IN (SELECT Project.ID FROM Projecten)

-- of 

SELECT * FROM Uren
WHERE NOT EXISTS (SELECT * FROM Projecten WHERE ID = Uren.ProjectID)


Dat werkt dan eventueel wel (er van uitgaande dat er mysql 4.1 of nieuwer gebruikt wordt).

  • Motrax
  • Registratie: Februari 2004
  • Niet online

Motrax

Profileert

Ik werk normaal met een gui tool en daar hoef je niet de gehele query in te tikken. Nadeel is dat als ik een keer iets uitschrijf het niet echt meer klopt ;)

Overigens snap ik je 2e statement niet, bedoel je een NOT EXISTS?

☻/
/▌
/ \ Analyseert | Modelleert | Valideert | Solliciteert | Generaliseert | Procrastineert | Epibreert |


  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
Bedankt voor de hulp!

Nu heb ik nog een MySQL vraag, namelijk het feit dat ik moeite heb om in 1 query een overzicht van de projecten, de gemaakte uren en de beschikbare uren wil hebben. Alles gaat goed, maar ik krijg een veel te hoog beschikbare uren aantal.

Ik zal het even uitleggen hoe het zit qua hierarchie:
Project -> Projectphase -> Hourentry

In Project staan gegevens als Naam van het project etc. In Projectphase zitten de verschillende fases van het project waar Projectphase.Hours staat voor het aantal uur dat men er aan mag besteden. In Hourentry staan de gemaakte uren.

Nu wil ik een overzicht als volgt.
ProjectID | Naam | aantal fases | totalHours | usedHours

mijn query is als volgt:
SQL:
1
2
3
4
5
6
7
8
9
10
select
project.`ID`,
project.`name`,
count(distinct projectphase.`ID`) as amount,
sum(projectphase.`hours`) as totalhours,
sum(hourentry.`hours`) as usedhours
from project
left outer join projectphase on (project.`ID` = projectphase.`projectID`)
left outer join hourentry on (projectphase.`ID` = hourentry.`projectPhaseID`)
group by project.`ID`, project.`name`;

Alles klopt bij de output, behalve het totalHours. Dat is veel te veel! Dat komt waarschijnlijk omdat ie de hours sommeert voordat ie alles grouped, maar ik weet niet hoe ik het op kan lossen.

Engineering is like Tetris. Succes disappears and errors accumulate.


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Motrax schreef op maandag 23 juli 2007 @ 13:39:
Overigens snap ik je 2e statement niet, bedoel je een NOT EXISTS?
Yep, een EXISTS is idd wat onzinnig in deze context :)

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
armageddon_2k1 schreef op maandag 23 juli 2007 @ 13:52:
Bedankt voor de hulp!

Nu heb ik nog een MySQL vraag, namelijk het feit dat ik moeite heb om in 1 query een overzicht van de projecten, de gemaakte uren en de beschikbare uren wil hebben. Alles gaat goed, maar ik krijg een veel te hoog beschikbare uren aantal.

Ik zal het even uitleggen hoe het zit qua hierarchie:
Project -> Projectphase -> Hourentry

In Project staan gegevens als Naam van het project etc. In Projectphase zitten de verschillende fases van het project waar Projectphase.Hours staat voor het aantal uur dat men er aan mag besteden. In Hourentry staan de gemaakte uren.

Nu wil ik een overzicht als volgt.
ProjectID | Naam | aantal fases | totalHours | usedHours

mijn query is als volgt:
SQL:
1
2
3
4
5
6
7
8
9
10
select
project.`ID`,
project.`name`,
count(distinct projectphase.`ID`) as amount,
sum(projectphase.`hours`) as totalhours,
sum(hourentry.`hours`) as usedhours
from project
left outer join projectphase on (project.`ID` = projectphase.`projectID`)
left outer join hourentry on (projectphase.`ID` = hourentry.`projectPhaseID`)
group by project.`ID`, project.`name`;

Alles klopt bij de output, behalve het totalHours. Dat is veel te veel! Dat komt waarschijnlijk omdat ie de hours sommeert voordat ie alles grouped, maar ik weet niet hoe ik het op kan lossen.
SQL:
1
sum(projectphase.hours) / count(hourentry.hours)

  • armageddon_2k1
  • Registratie: September 2001
  • Laatst online: 27-07 10:18
helaas, was het maar zo simpel :) nu krijg ik allemaal rare fracties eruit (wat ook te verwachten was).

Engineering is like Tetris. Succes disappears and errors accumulate.

Pagina: 1