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

[mysql] mysql naar xml

Pagina: 1
Acties:
  • 252 views sinds 30-01-2008
  • Reageer

  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Stel ik heb het volgende model:

movies
id
name

categories
id
name

moviescategories
id
movieid
categoryid

Een movie kan in meerdere categorieen voorkomen, dit wordt bijgehouden middels de koppeltabel moviescategories.

Nu wil ik de volgende xml genereren met behulp van 1 query:
[code=xml]
<movies>
<movie>
<name>name</name>
<categories>
<category>name1</category
<category>name2</category
...
</categories>
</movie>
<movie>
....
</movie>
....
</movies>
[/code=xml]
Het gaat me nu om het categories gedeelte. Ik kan geen query bedenken hoe ik dit kan doen. Ik kan het wel via php doen door eerst 1 query voor de film te maken en dan voor de categorie etc.. maar dat is niet de bedoeling. Het zou het mooiste zijn als ik de categories in een comma separated list uit de mysql tabel kan halen en deze dan met behulp van php kan exploden. Dit is me alleen nog niet gelukt. Is dit uberhaupt wel mogelijk?

Dus dat ik een query heb die als output heeft per film:

is,name,catnames(commaseparated).

  • Spockz
  • Registratie: Augustus 2003
  • Laatst online: 19-11 13:44

Spockz

Live and Let Live

Zoiets?:
SQL:
1
2
3
4
SELECT movies.id, movies.name, categories.name
FROM movies, categories, moviescategories
WHERE movies.id = moviescategories.movieid 
      AND categories.id = moviescategories.categoryid

C'est le ton qui fait la musique. | Blog | @linkedin
R8 | 18-55 IS | 50mm 1.8 2 | 70-200 2.8 APO EX HSM | 85 1.8


  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 09:32
Buiten het feit dat ik me afvraag waarom je in movies EN in moviescategories een categoryid specificeerd zou het zoiets moeten zijn als:

select c.name, m.name from movies as m, categories as c where (select id from movies ) = c.movieid

offtopic:
Het is pseudo-code/mysql aangezien het al ontzettend lang geleden is voor mij dat ik voor het laatst iets in sql gemaakt heb

Strava | AP | IP | AW


  • FragFrog
  • Registratie: September 2001
  • Laatst online: 20-11 13:35
Zo te zien is de catagoryId kolom in je movies tabel overbodig, tenzij je hem als hoofdcatagorie wilt gebruiken dan is'ie verkeerd benoemd.

Aangaande je vraag: meerdere velden in een CSL returnen is voor zover ik weet niet mogelijk met MySQL. Wat je wel kan doen is 3 queries uitvoeren die elk een tabel ophalen en in een array zetten en vervolgens in PHP de array's mergen. Niet heel erg moeilijk, wel lekker snel :)

[ Site ] [ twitch ] [ jijbuis ]


  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Kijk anders eens naar de Microsoft SQL oplossing 'FOR XML EXPLICIT'.

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
select
1 as Tag,
null as Parent,
m.id as [movie!1!id],
m.name as [movie!1!name],
null as [category!2!name]
from movies

union

select 
2 as Tag,
1 as Parent,
mc.id as [movie!1!id],
null as [movie!1!name],
c.name as [category!2!name]
from moviescategory mc inner join categories c on mc.categoryid=c.id

order by [movie!1!id], Tag, [category!2!name]


Deze query levert een platte presentatie van je xml op.
de eerste regel heeft geen [category!2!name] (null value), terwijl juiste de child records (categories) een null value voor [movie!1!name] opleveren.

Als je het resultaat ziet, zal het principe erachter wel duidelijk worden denk ik. De union(s) worden uiteindelijk via de order by op de juiste manier gesorteert.

If it isn't broken, fix it until it is..


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Bestaat er in mysql niet iets als implode, zodat ik zoiets kan doen:

SELECT m.id,m.name,(SELECT IMPLODE(c.name,''))

Verwijderd

RSD schreef op woensdag 23 januari 2008 @ 14:46:
Bestaat er in mysql niet iets als implode, zodat ik zoiets kan doen:

SELECT m.id,m.name,(SELECT IMPLODE(c.name,''))
Bedoel je mss CONCAT() of begrijp ik je vraag nou niet goed?

  • BarthezZ
  • Registratie: Juli 2004
  • Niet online

BarthezZ

anti voetbal en slechte djs!

Waarom wil je dit eigenlijk zo doen? dingen door je database server laten afhandelen is ook niet heilig.
En door middel van een php script valt dit veel simpeler af te handelen.

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
maak een array op en loop daar lekker doorheen! 10x makkelijker dan het gepriegel wat je nu doet...

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 20-11 18:44
Misschien een idee om alle entries uit moviescategories te pakken, daar de movies.name en category.name bij te joinen en te sorteren op movieid. Je hebt alleen, movieid, movies.name en category.name nodig.

Dan heb je wel wat dubbele data, maar je hebt maar één query nodig en het is niet verschrikkelijk ingewikkeld te begrijpen. Vervolgens is het een kwestie van alle records doorlopen. Als je naar het volgende record springt, en movieid is hetzelfde gebleven, dan heb je dus een nieuwe categorie voor die movie. Als movieid verschilt, dan heb je dus een nieuwe film te pakken.

edit:
Volgens mij hetzelfde als wat Spockz doet :)

[ Voor 9% gewijzigd door Jaap-Jan op 23-01-2008 15:03 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett


Verwijderd

kijk eens naar group_concat.. dan selecteer je gewoon als je movies met de daarbij behorende catagorieën, group je op movie en regel je met group_concat je comma seperated catagorie lijstje

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Het mooiste is dan natuurlijk met
SQL:
1
2
3
CONCAT('    <category>',
   GROUP_CONCAT(categories.naam SEPARATOR '</category\n    <category>'),
   '<category\n')

Je gebruikt dan het SqlHtml pattern. Hoef je ook gelijk nooit meer de database-engine te vervangen.. ;)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Verwijderd

pedorus schreef op woensdag 23 januari 2008 @ 15:55:
Het mooiste is dan natuurlijk met
SQL:
1
2
3
CONCAT('    <category>',
   GROUP_CONCAT(categories.naam SEPARATOR '</category\n    <category>'),
   '<category\n')

Je gebruikt dan het SqlHtml pattern. Hoef je ook gelijk nooit meer de database-engine te vervangen.. ;)
dat vind ik helemaal niet mooi.. je gooit 2 datalagen (database en xml) én opmaak (de \n en tabs) allemaal door elkaar heen..

  • BHR
  • Registratie: Februari 2002
  • Laatst online: 18-11 20:21

BHR

Tip: kijk even wat thedailywtf.com voor een site is (en bookmarken :P )

[ Voor 42% gewijzigd door BHR op 23-01-2008 16:19 ]

No amount of key presses will shut off the Random Bug Generator


Verwijderd

BHR schreef op woensdag 23 januari 2008 @ 16:18:
[...]
Tip: kijk even wat thedailywtf.com voor een site is (en bookmarken :P )
thedailywtf.com ken ik al ja, maar ik had de link al helemaal niet bekeken omdat ik het zo'n onzin vond :D.. Denk ik wijs de TS er ook even op.

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Voor de duidelijkheid: de oplossing zoals in Jaap-Jan's post lijkt me tot nu toe de beste. Dan kun je namelijk gelijk zorgen dat de categorie "Grappen, grollen & onzin" geen probleem is. En je bent niet gebonden aan MySQL.

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


  • RSD
  • Registratie: Maart 2001
  • Laatst online: 08-02-2017
Wat is que preformance in jullie ogen het beste, de GROUP_CONCAT of een JOIN en dan in php de boel netjes afdrukken. Met GROUP_CONCAT kan ik het lijstje in 1 regel tergu krijgen gescheiden door een komma. In de categorie naam komen alleen cijfers en letters voor en geen andere vreemde tekens dus dat is goed op te lossen. In PHP hoeh ik die GROUP_CONCAT record dan alleen maar te exploden en dan met fopreach de tags eromheen te zetten. De andere vergt wat meer php. Wat is het beste?

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 20-11 18:44
De eerste vraag die je je moet stellen is hoe belangrijk performance is, of er bottlenecks kunnen zijn. Qua snelheid zal het elkaar waarschijnlijk niet veel ontlopen. Mijn methode levert wat meer dataverkeer op, GROUP_CONCAT vraagt meer processing op de database.

Als je wilt weten hoe belangrijk performance is, moet je je dus gaan afvragen:
1) Hoeveel gebruikers gebruiken het systeem tegelijk?
2) Hoe groot wordt de database qua films en categoriën?

Als je dat soort dingen weet, kun je gaan benchmarken en kijken hoe snel het systeem performt in beide situaties.

Als het antwoord op beide vragen 'niet zoveel' is, kies dan gewoon de methode waar jij het meeste voor voelt.

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett

Pagina: 1