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

Mysql, join & dubbele velden

Pagina: 1
Acties:

Verwijderd

Topicstarter
Stel, ik heb 2 tabellen, tabel1: car_models en tabel2: cars.
Car_models zijn de modellen, bevatten uitgebreidere informatie en de standaardeigenschappen. Cars zijn de auto's van de gebruikers, deze bevatten velden die ook in car_models zitten maar die verschillen (bv kleur, gewicht, ...).

Nu wil ik van 1 auto alle informatie ahv 1 query, deze moet de specifieke 'car' velden en de velden van 'car_models' bevatten. Het probleem situeerd zicht bij de velden die in beide tabellen voorkomen.
Is het met een sql query een JOIN uit te voeren zoals hieronder, maar wel zodat de velden die dubbel zijn slechts 1x voorkomen en de waarde van die uit de tabel 'cars' gekozen wordt?
code:
1
SELECT cars.*, car_models.* ". "FROM car_models  LEFT JOIN cars ON cars.type = car_models.ID WHERE cars.ID = '$this->car_id'



Ik weet dat ik dit ook handmatig kan doen door car_models.* te vervangen door de velden die ik nodig heb, maar dit is veel werk en dit moet telkens aangepast worden als de tabelstructuur aangepast wordt. Daarom m'n vraag of dit niet kan met sql, anders zal ik dit waarschijnlijk in PHP programmeren.

  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Verwijderd schreef op woensdag 03 oktober 2007 @ 21:53:
Stel, ik heb 2 tabellen, tabel1: car_models en tabel2: cars.
Car_models zijn de modellen, bevatten uitgebreidere informatie en de standaardeigenschappen. Cars zijn de auto's van de gebruikers, deze bevatten velden die ook in car_models zitten maar die verschillen (bv kleur, gewicht, ...).

Nu wil ik van 1 auto alle informatie ahv 1 query, deze moet de specifieke 'car' velden en de velden van 'car_models' bevatten. Het probleem situeerd zicht bij de velden die in beide tabellen voorkomen.
Is het met een sql query een JOIN uit te voeren zoals hieronder, maar wel zodat de velden die dubbel zijn slechts 1x voorkomen en de waarde van die uit de tabel 'cars' gekozen wordt?
[code]SELECT cars.*, car_models.* ". "FROM car_models LEFT JOIN cars ON cars.type = car_models.ID WHERE cars.ID = '$this->car_id'[code]
Er vanuitgaande dat wanneer je Car-kolommen NULL bevatten wanneer ze geen wijziging bevatten ten opzichte van de bijbehorende Car_Model kun je met ISNULL of COALESCE waarschijnlijk wel bereiken wat je wilt:
SQL:
1
2
3
4
5
6
7
SELECT
   coalesce(mdl.engine, car.engine) as engine,
   coalesce(mdl.horsepower, car.horsepower) as horsepower,
   /* ... */
FROM car_models as mdl 
LEFT JOIN cars as car ON (car.type = mdl.ID)
WHERE cars.ID = '$this->car_id'

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 13:02

Dido

heforshe

Ten eerste zou ik dan de volgorde in die coalesce omdraaien (mdl is alijd gevuld, dus wordt car nooit getoond zoals het er nu staat).

Ten tweede is dit volgens mij precies wat de TS niet wil...
k weet dat ik dit ook handmatig kan doen door car_models.* te vervangen door de velden die ik nodig heb, maar dit is veel werk en dit moet telkens aangepast worden als de tabelstructuur aangepast wordt.
Toch denk ik dat het de enige nette manier is. In principe is er iets fishy als gelijke informatie in verschillende tabellen staat (iets met normalisatie enzo ;) ).
SQL is er niet op berekend om gelijkwaardige informatie te herkennen - velden bevatten verschillende informatie, of het zijn sleutelvelden.

Wat betekent mijn avatar?


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
Dido schreef op woensdag 03 oktober 2007 @ 22:10:
Ten eerste zou ik dan de volgorde in die coalesce omdraaien (mdl is alijd gevuld, dus wordt car nooit getoond zoals het er nu staat).
Eh, ja... stom van me.50% kans he... :P
Ten tweede is dit volgens mij precies wat de TS niet wil...

[...]


Toch denk ik dat het de enige nette manier is. In principe is er iets fishy als gelijke informatie in verschillende tabellen staat (iets met normalisatie enzo ;) ).
SQL is er niet op berekend om gelijkwaardige informatie te herkennen - velden bevatten verschillende informatie, of het zijn sleutelvelden.
Ik twijfelde over dat stukje; het is ofwel de betekenis die jij eraan geeft, ofwel dat hij de query per geval (i.e. per auto die hij opvraagt) moet aanpassen om het juiste resultaat te bereiken.

Het eerste geval, daar is SQL niet voor bedoeld (zoals je al aangaf), en in het tweede geval voldoet coalesce prima. Dus TS mag kiezen.