[MySQL] alles dubbel bij left join

Pagina: 1
Acties:

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ff wat uitleg vooraf:

Ik heb een HTML template, waar ruimte is voor een artikel, met een titel, kopje en body tekst. Daarnaast is er ruimte om er wat plaatjes in te dumpen. De editor-interface mag/kan niet WYSIWYG zijn (ivm MacIE), in plaats daarvan maak ik een limited tagsetje voor paragrafen, subkopjes en max 1 plaatje per paragraaf met wrap-around tekst. De plaatjes moeten ook via een form worden geupload, de koppeling tussen plaatje plek in de body doe ik door de editors te vragen het plaatje een naam te geven, die dan met de tag [img=naamvanplaatje] gekoppeld wordt.

De plaatjes heb ik een aparte tabel staan, met daarin een ref_id om te verwijzen naar het artikel waar het plaatje bijhoort. Nu wil ik met 1 query de hele zut eruit trekken, maar ipv 1 resultaat krijg ik $aantalPlaatjes resultaten, met steeds dezelfde title, head en body, en dus steeds een andere URL van het plaatje. Dat geburt met de volgende query:
code:
1
2
3
SELECT article.title, article.head, article.body, image.url
FROM article LEFT JOIN image ON article.id = image.ref_id
WHERE article.id = $id



Nu vraag ik me dus af of dat niet beter kan, een soort van hierarchische result-set met daarin title, head en body en een plaatjes array met daarin alle plaatjes-URLs. Ik zou ook nog wel tevreden zijn met alleen in het eerste resultaat de title, head, body en het eerste plaatje, en vervolgens de rest van de plaatjes in aparte results. Of moet ik me helemaal niet druk maken om die dubbeling van data? Lijkt me sterk...maarja wie weet kannet wel ni anders..

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 14:19
code:
1
2
DISTINCT
GROUP BY

Dan krijg je iig alles 1 keer :).

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
hmm dat moet genoeg zijn om er uit te komen, twee dingen die'k nog nooit gezien heb :)
dank

  • sverzijl
  • Registratie: Januari 2001
  • Laatst online: 12:53
Op vrijdag 19 juli 2002 18:03 schreef ddc het volgende:
code:
1
2
DISTINCT
GROUP BY

Dan krijg je iig alles 1 keer :).
een DISTINCT zal niets uitmaken hier. Alle combinaties die hij nu al terugkrijgt ZIJN al uniek.
En een GROUP BY daar heb je pas iets aan als je grouping functions gebruikt.

Genoil, ik weet niet precies hoe je de resultset van de query verder gaat bewerken en waarmee, maar het gemakkelijkst is om de query simpelweg te splitsen in 2 losse queries. 1 om de inhoud op te halen en 1 om de images op te halen.

Waarom moeilijk doen als het ook makkelijk kan ?

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
ik kom er idd niet helemaal uit met DISTINCT en GROUP BY

dit werkt wel:
code:
1
2
3
SELECT DISTINCT article.title, image.url, image.position 
FROM article LEFT JOIN image ON article.id = image.ref_id
WHERE (article.id = $id) GROUP BY image.url

maar als ik dus article.head en article.body er ook uit wil halen, werkt het niet meer:
code:
1
2
3
SELECT DISTINCT article.title, article.head, article.body, image.url, image.position 
FROM article LEFT JOIN image ON article.id = image.ref_id
WHERE (article.id = $id) GROUP BY image.url

--> krijg ik dus gewoon alles weer dubbel. overal apart DISTINCT voorzetten vind mysql niet tof.

tsja en waarom moeilijk doen als het makkelijk kan? ik vind het gewoon een interessant probleem, de makkelijke oplossing ligt natuurlijk zwaar voor de hand, maar ik wil nu wel eens kijken wat voor een stoere dingen je nu werkelijk kunt met SQL. Als dit al niet eens kan zou ik het toch wel behoorlijk suf vinden...

Verwijderd

dubbele/driedubbele/.. resultaten duiden meestal op het vergeten van een "verbinding" tussen 2 tabellen.. kijk daar eens na.

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Op maandag 22 juli 2002 12:23 schreef DiEana het volgende:
dubbele/driedubbele/.. resultaten duiden meestal op het vergeten van een "verbinding" tussen 2 tabellen.. kijk daar eens na.
hoe bedoel je? ik heb een tabel 'article' met o.a een 'id' field, en een tabel 'image' met o.a. een ref_id field. Die ref_id verwijst (bijvoorbeeld naar) article.id. Meer hoef ik ni te verbinden, toch?

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:18

Dido

heforshe

Maar als ik het goed begrijp krijg je helemaal geen dubbele rijen, maar rijen die dezelfde article.id hebben etc. maar verschillende plaatjes. Als die plaatjes niet bij dat artikel horen zit er dus in die link iets fout. Zet in je select image.ref_id er eens bij?

Wat betekent mijn avatar?


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Op maandag 22 juli 2002 12:45 schreef Dido het volgende:
Maar als ik het goed begrijp krijg je helemaal geen dubbele rijen, maar rijen die dezelfde article.id hebben etc. maar verschillende plaatjes. Als die plaatjes niet bij dat artikel horen zit er dus in die link iets fout. Zet in je select image.ref_id er eens bij?
Er kunnen meerdere plaatjes bij 1 artikel horen. Maar bovenstaande query zorgt er dus voor dat er voor elk plaatje dat er bij het artikel zit, de benodige velden uit het artikel in elk resultaat zitten, met alleen een verschillend plaatje. Ik vroeg me af of je bijvoorbeeld niet alleen in het eerste resultaat de artikeldata kunt krijgen en in de rest alleen de verschillende plaatjes.

Hmm blijkbaar schept zo'n wens een dusdanige verwarring dat het wel niet zal kunnen ;) Alhoewel, als ik slechts 1 field uit article pak met DISTCINT ervoor een GROUP BY op image.url, werkt het prima...nu dus nog voor meerdere velden uit article.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 11:18

Dido

heforshe

Je query haalt nu alle plaatjes op die bij een opgegeven artikel horen...
Waarom doe je dan niet twee queries, eentje om de ontbrekende artikelgegevens op te halen, en eentje met de bij het ID behorende plaatjes? Dan haal je geen dubbele info meer op. Dus gewoon zoiets:
code:
1
2
3
4
5
6
7
8
9
SELECT title, head, body
  FROM article
 WHERE id = $id

en

SELECT image.url
  FROM image
 WHERE ref_id = $ID

Dan ben je er toch? Of mis ik iets?

Wat betekent mijn avatar?


  • sverzijl
  • Registratie: Januari 2001
  • Laatst online: 12:53
Op maandag 22 juli 2002 11:54 schreef Genoil het volgende:
tsja en waarom moeilijk doen als het makkelijk kan? ik vind het gewoon een interessant probleem, de makkelijke oplossing ligt natuurlijk zwaar voor de hand, maar ik wil nu wel eens kijken wat voor een stoere dingen je nu werkelijk kunt met SQL. Als dit al niet eens kan zou ik het toch wel behoorlijk suf vinden...
Wat jij wil kan simpelweg niet in 1 query (tenzij je natuurlijk de dubbele title/head/body negeert, maar dit is erg inefficient)

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Op maandag 22 juli 2002 13:24 schreef sverzijl het volgende:

[..]

Wat jij wil kan simpelweg niet in 1 query (tenzij je natuurlijk de dubbele title/head/body negeert, maar dit is erg inefficient)
Kijk da's een helder antwoord :)
Ik zie nu ook ineens dat datgene waarvan ik dacht dat het wel werkte, ook gewoon dubbele resultaten oplevert...

Tsja dan maar 2 queries...wat een prutstaaltje dat SQL :+

Verwijderd

Op maandag 22 juli 2002 13:37 schreef Genoil het volgende:

[..]

Kijk da's een helder antwoord :)
Ik zie nu ook ineens dat datgene waarvan ik dacht dat het wel werkte, ook gewoon dubbele resultaten oplevert...

Tsja dan maar 2 queries...wat een prutstaaltje dat SQL :+
Beetje logisch.. Je hebt 1 artikel en meerdere fototjes. Hoe ga je dat "samen in 1 query" neerhalen? Niet toch? Ja, zoals jij had, maar dan ga je alle zaken zoals titels/teksten/... "meerdere keren" moeten afhalen.
Meerdere keren -> het aantal fototjes in het betreffende artikel ==> ERG inefficiënt!

2 queries dus.

  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
offtopic:
ja bij nader inzien is het ook wel logisch, aangezien SQL tabel-georienteerd is. Zou zoiets met XPath nou wel kunnen, aangezien XML boom-georienteerd is?

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
Op maandag 22 juli 2002 14:15 schreef Genoil het volgende:
Zou zoiets met XPath nou wel kunnen, aangezien XML boom-georienteerd is?
Als je een nette structuur opzet kan dat inderdaad. Je houdt natuurlijk wel het probleem dat je plaatjes niet bij de andere informatie kwijt kunt; dit is op te lossen door (net als in een DB) een verwijzing op te nemen.
code:
1
2
3
4
5
6
7
8
<article>
    <title>hier je titel</title>
    <head>inleiding tot het artikel</head>
    <body>
      <paragraph id="1" image="plaatje1">Het artikel zelf</paragraph>
      <paragraph id="2" image="plaatje2">Het artikel zelf (continued)</paragraph>
    </body>
</article>

Nu kun je een heel artikel in één keer uit je database/tekstbestand/xml-server :9 halen.

Pas de replâtrage, la structure est pourrie.


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Jahahah mooi is dat XML :) Nog ff deze k*tklus afraggen in PHP_MySQL en dan maar eens een fijne Cocoon servert in elkaar gaan prutsen.

Cross-referencing in XML kan trouwens ook heel cool met XLink.

  • Apollo_Futurae
  • Registratie: November 2000
  • Niet online
Op maandag 22 juli 2002 16:30 schreef Genoil het volgende:
Cross-referencing in XML kan trouwens ook heel cool met XLink.
Inderdaad, er zijn hele mooie oplossingen te bedenken met XLink, onder andere met Linkbases. Erg interessant, maar ik geloof niet dat het al voor dagelijks gebruik geschikt is. Of is er iemand die hier al mee werkt?

P.S.: Dit is erg offtopic, maar het probleem is opgelost en de topicstarter lijkt dit ook te interesseren. Als dit toch beter in een ander topic kan moet een modje dit maar ff roepen.

Pas de replâtrage, la structure est pourrie.


  • Genoil
  • Registratie: Maart 2000
  • Laatst online: 12-11-2023
Op maandag 22 juli 2002 16:42 schreef Apollo_Futurae het volgende:

[..]

P.S.: Dit is erg offtopic, maar het probleem is opgelost en de topicstarter lijkt dit ook te interesseren. Als dit toch beter in een ander topic kan moet een modje dit maar ff roepen.
Nou als het een beetje tegenzit kom ik vanaf volgende maand wel met een paar topics ;)
Pagina: 1