Toon posts:

[MySQL] meerdere records bij join

Pagina: 1
Acties:

Verwijderd

Topicstarter
ik heb de volgende tabellen:
prijs_artikel (met id, id_artikel, datum_vanaf en prijs)
artikel (met id, naam)

je kunt dus per artikel meerdere prijzen invoegen welke die pas moet uitlezen bij een bepaalde datum.

SELECT a.naam, p.prijs, p.datum_vanaf
FROM artikel a, artikel_prijs p
WHERE p.id_artikel = a.id
AND p.datum_vanaf <= curdate()

maar ik krijg als ik meerdere datums invoer welke al verstreken zijn per artikel meer records terug.
hoe moet ik dit oplossen!?
ik heb gejoint, gegrouped, gelimit maar kom er niet uit.

[ Voor 5% gewijzigd door Verwijderd op 12-07-2006 12:02 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 17:04
Logisch toch dat je alle records terugkrijgt waarvoor de datum kleiner of gelijk is dan de datum die je specifieert ?
Wat wil je dan precies ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
ik wil dan alleen de (de prijs van) nieuwste datum terughebben (van dat artikel).
het zou wel kunnen als ik 2 querys maak, maar wil het in 1 query... en een limit
in een join gaat ook niet werken!?

@ JeRa
die had ik ook al geprobeerd, maar dan krijg ik alle datums terug van 1 artikel die al verstreken is.

[ Voor 66% gewijzigd door Verwijderd op 12-07-2006 12:18 ]


  • Suaver
  • Registratie: Januari 2004
  • Laatst online: 19-11-2025

Suaver

jokecoat

moet je de datum niet tussen #'jes zetten ?

You, me, us, together, me, us, you, we, us, you, me... DONE.


  • JeRa
  • Registratie: Juni 2003
  • Laatst online: 30-04-2025
Volgens mij heeft het weinig met die datum te maken maar meer met het feit dat je geen nette 1:1-relatie hebt tussen artikel en artikel_prijs. Doe eens een normale JOIN:

code:
1
2
3
4
SELECT a.naam, p.prijs, p.datum_vanaf
FROM artikel a
LEFT JOIN artikel_prijs p ON a.id = p.id_artikel
WHERE p.datum_vanaf <= curdate();

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 19:42

Creepy

Tactical Espionage Splatterer

JeRa schreef op woensdag 12 juli 2006 @ 12:16:
Volgens mij heeft het weinig met die datum te maken maar meer met het feit dat je geen nette 1:1-relatie hebt tussen artikel en artikel_prijs. Doe eens een normale JOIN:

code:
1
2
3
4
SELECT a.naam, p.prijs, p.datum_vanaf
FROM artikel a
LEFT JOIN artikel_prijs p ON a.id = p.id_artikel
WHERE p.datum_vanaf <= curdate();
Hij doet een normale JOIN, een INNER JOIN zelfs ;)
En hij zegt zelf dat er geen 1:1 relatie gebruikt wordt omdat er meerdere prijzen zijn voor 1 artikel.

Als je de nieuwste datum wilt hebben, kijk dan eens naar MAX(). Of sorteer op datum (eerste bovenaan) en gebruik een LIMIT 1.

[ Voor 8% gewijzigd door Creepy op 12-07-2006 12:25 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
maar de 1:1 relatie die query je dan toch!?

SELECT a.naam, p.prijs, max(p.datum_vanaf)
FROM artikel a
LEFT JOIN artikel_prijs p ON a.id = p.id_artikel
WHERE p.datum_vanaf <= curdate() GROUP BY a.naam

als ik de bovenstaande query gebruik krijg ik wel de juiste datum naar voren, maar heeft ie m niet goed gejoint aan de juiste prijs...

  • whoami
  • Registratie: December 2000
  • Laatst online: 17:04
Je moet op alle velden groeperen die in je select list staan, en geen deel uitmaken van een aggregate function.

Verder zou je het evt ook met een subquery kunnen oplossen.

https://fgheysels.github.io/


  • DND_Roche
  • Registratie: Juli 2006
  • Laatst online: 02-01-2024
Ik weet niet of deze constructie in MySQL is toegestaan; dit komt uit Oracle. Maar misschien helpt dit je op weg:

SQL:
1
2
3
4
5
6
7
8
9
10
SELECT a.naam, p.prijs, p.datum_vanaf
  FROM artikel a
     , artikel_prijs p
     , ( SELECT id_artikel
              , MAX( datum_vanaf) max_datum_vanaf
           FROM artikel_prijs
          WHERE datum_vanaf <= curdate()) m
 WHERE p.id_artikel = a.id
   AND m.id_artikel = a.id
   AND p.datum_vanaf = m.max_datum_vanaf

Houd echter rekening met de mogelijkheid met meerdere prijzen op een dag (door bijv. foutief ingegeven prijzen die gecorrigeerd worden). Wij nemen als extra controle de hoogste id (ofwel de laatst opgevoerde prijs) mee als juiste prijs op een datum.

[ Voor 4% gewijzigd door DND_Roche op 13-07-2006 09:06 . Reden: code-tags O-) ]

Pagina: 1