Toon posts:

[MySQL] Uitdaging in query.

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb twee verschillende versies van teksten. Aan de hand van een enum wordt de gebruikte tekst geselecteerd.

De tabelstructuur is als volgt:

[teksten]
id_tekst
versie(ENUM '1','2')

[tekst_1]
id_tekst_1
id_tekst
naam
tekst

[tekst_2]
id_tekst_2
id_tekst
naam
tekst

Nu wil ik dus met een query alle gebruikte teksten ophalen.
Ik dacht dit als volgt te doen, maar dan zegt hij dat tekst ambigious is.
code:
1
2
3
4
SELECT teksten.id_tekst, tekst
FROM teksten, tekst_1, tekst_2
WHERE (teksten.id_tekst= tekst_1.id_tekst AND versie=1)
OR (teksten.id_tekst= tekst_2.id_tekst AND versie=2)

Iemand een idee hoe ik dit mooi kan oplossen? Ik gebruik nog versie 3 van MySQL en kan dus geen subqueries gebruiken. De volgende stap is om met een FULLTEXT te zoeken in de teksten, maar als ik deze SELECT aan de praat krijg, dan zal dat ook wel lukken. Alvast bedankt.

[ Voor 3% gewijzigd door Verwijderd op 15-06-2005 10:58 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Hint: UNION :)

Hiermee moet je er wel komen

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


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

SELECT teksten.id_tekst, tekst
Uit welke tabel wil je 'tekst' halen? Dat moet je even opgeven.

Siditamentis astuentis pactum.


Verwijderd

Topicstarter
Ik wil hem of uit tekst_1 halen, of uit tekst_2, afhankelijk van de versie die in teksten is geselecteerd.

Dan kan ik wel

SELECT id_tekst, tekst_1.tekst, tekst_2.tekst

doen, maar dan krijg ik twee kolommen met teksten terug.

  • cenix
  • Registratie: September 2001
  • Laatst online: 05-05 19:45
dus iets als
code:
1
SELECT teksten.id_tekst, tekst_1.tekst

wil je echter de tekst van tekst_1 en tekst_2 samenvoegen, dan zul je volgens mij een union moeten gebruiken.
Echter geen nieuw antwoord, maar een combi van P_de_B en Varienaja

Verwijderd

Topicstarter
UNION is used to combine the result from many SELECT statements into one result set. UNION is available from MySQL 4.0.0 on.

Helaas, ik gebruik versie 3 en kan dit ook niet veranderen.

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 06-05 18:51

Creepy

Tactical Espionage Splatterer

En mocht je er nog steeds niet uitkomen, geef dan via een topictreport aub een iets betere topictitel door. Zie ook *** Over topictitels in P&W - lezen voor topic openen!!! ***. "Uitdaging in query" kan echt vanalles zijn ;)

Waarom je nu echter twee tabellen gebruikt is me een raadsel. Type had je net zo goed in tekst_1 kunnen opnemen.

"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
Ik wil beide versies van de teksten houden, dus dan had ik ook een tabel

[teksten]
id_tekst
versie(ENUM 1,2)
tekst_1
tekst_2

kunnen maken, maar dan had ik heel veel overhead gehad, omdat er maar heel beperkt een tweede versie van de tekst aanwezig is.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 06-05 19:18

Dido

heforshe

Je zou eens kunen kijken naar een case constructie in je select. (case versie=1 tekst_1.tekst, versie=2 tekst_2.tekst) as teksts oid.

Op zich is het datamodel inderdaad op zijn zachts gezegd suboptimaal, zoals creepy terecht opmerkt :)

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Ik zou niet beter weten. Wat stel je voor dan?

  • FrankvR
  • Registratie: Mei 2004
  • Laatst online: 01-01-2025
Ten eerste is er duidelijk iets mis met je database-model, maargoed dat vraag je niet.

Het antwoord op je vraag:

SELECT teksten.id_tekst,
CASE versie
WHEN 1
THEN tekst_1.tekst
WHEN 2
THEN tekst_2.tekst
END AS tekst
FROM teksten
LEFT JOIN tekst_1 ON teksten.id_tekst = tekst_1.id_tekst
LEFT JOIN tekst_2 ON teksten.id_tekst = tekst_2.id_tekst

edit:

Dido :( ;)

[ Voor 8% gewijzigd door FrankvR op 15-06-2005 11:20 ]


  • Dido
  • Registratie: Maart 2002
  • Laatst online: 06-05 19:18

Dido

heforshe

Verwijderd schreef op woensdag 15 juni 2005 @ 11:16:
Ik zou niet beter weten. Wat stel je voor dan?
Wat zou je zeggen van een tabel met (tekst_id, versie) als sleutel, en je veld tekst erachter?
Kun je al je versies in kwijt (desnoods versies 3-999 ook) en je query wordt miraculeus eenvoudig ;)

@FrankvR: Gamma ;) (Ik had hem alleen niet uitgekauwd :) )

[ Voor 37% gewijzigd door Dido op 15-06-2005 11:19 ]

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Frank bedankt. Ik ga er even naar kijken.
Dido: Klinkt goed, zo'n gecombineerde sleutel, maar dan moet ik nog steeds twee tekst velden in die tabel hebben, waarvan de helft niet gebruikt wordt. Of zie ik dat vekeerd.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 06-05 19:18

Dido

heforshe

Verwijderd schreef op woensdag 15 juni 2005 @ 11:27:
Frank bedankt. Ik ga er even naar kijken.
Dido: Klinkt goed, zo'n gecombineerde sleutel, maar dan moet ik nog steeds twee tekst velden in die tabel hebben, waarvan de helft niet gebruikt wordt. Of zie ik dat vekeerd.
Ja, ik denk dat je dat verkeerd ziet :)

Denk aan zoiets:

[teksten]
id_tekst
versie(ENUM '1','2')

[tekst_1]
id_tekst
versie
tekst


Er kunnen bij max. twee versies dan 0, 1 of 2 records in tekst_1 aanwezig zijn :)

Je kunt in tekst_1 ook een (technische) sleutel opnemen (id_tekst_1) als je dat wilt.

Je naamgeving voor de tabellen kan beter, maar dat kun je zelf wel verzinnen afhankelijk van de precieze situatie :)

[ Voor 6% gewijzigd door Dido op 15-06-2005 11:37 ]

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Hmm, dat is wel een goed plan eigenlijk. Ga ik proberen. Dan worden mijn zoekqueries in ieder geval een stuk simpeler.

  • Dido
  • Registratie: Maart 2002
  • Laatst online: 06-05 19:18

Dido

heforshe

Verwijderd schreef op woensdag 15 juni 2005 @ 11:46:
Dan worden mijn zoekqueries in ieder geval een stuk simpeler.
Dat is over het algemeen een van de eerste heel duidelijke voordelen van een goed datamodel. Daarnaast is het vaak zo dat als je queries erg ingewikkeld worden, er waarschijnlijk iets mis zit in je datamodel.
(Hoewel ook met een perfect datamodel erg ingewikkelde queries nodig kunnen zijn, hoor. Maar meestal niet om simpele vragen te beantwoorden.)

Wat betekent mijn avatar?


Verwijderd

Topicstarter
Thanks
Pagina: 1