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

[MYSQL]meerdere keren uit een tabel wat fetchen in een query

Pagina: 1
Acties:

  • mclegodude
  • Registratie: November 2013
  • Laatst online: 13-11 16:28
Mijn tabellen:
code:
1
2
3
4
5
6
basisBundels b  Additionele_bundels a
Id              Id
Name            Name
DurationMonths  DealGroupId
ProviderID      DurationMonths
                ProviderID

Er kunnen geen, een, of meerdere additionele bundels aan een basisbundel zitten.
Er is telkens een basisbundel geselecteerd
Alle mogelijke combinaties van additionele bundels moeten wergegeven worden.
Deze combinaties worden gelimiteerd door het feit dat er bij het combineren telkens maar een additionele bundel uit een DealGroup mag worden gekozen (zie fig 1)
de combinatie ID(0,4) mag, de combinatie Id(0,1) niet, omdat ze dezelfde dealgroup hebben.
code:
1
2
3
4
5
6
7
8
9
10
Id    Name           DealGroupId    DurationMonths    ProviderID
0     SMS 100        1              12                1
1     SMS 200        1              12                1
2     SMS 100        1              24                1
3     SMS 200        1              24                1
4     50 Minuten     2              12                1
5     100 Minuten    2              24                1
6     500 MB         3              12                1
7     1000 MB        3              12                1
8     Cloud 25 GB    4              24                1


Het resultaat moet terugkomen in de vorm:
b.Id b.Name b.DurationMonths b.ProviderID a.Id a.Name a.DealGroupId a.DurationMonths a.ProviderID
Waar alle a.* dus herhaald worden voor het aantal extra bundels dat in de combinatie zit.
Een mogelijk resultaat is dus:
0, Basis Samenstellen, 24, 1, 0, SMS 100, 1, 12, 1, 4, 50 Minuten, 2, 12, 1, 8, Cloud 25 GB, 4, 24, 1
Hier staan dus 3 additionele bundels achter elkaar (1 row) en op deze manier moeten dus alle combinaties van additionele bundels in unieke dealgroups gevonden worden.
Mijn vraag aan u: is dit mogelijk in 1 Query (eventueel met subquery’s) of moeten er meerdere query’s en eventueel een programmeertaal aan te pas komen.
dit is voor een simulatie die ik maak

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Technisch kan SQL Server het wel (MySQL weet ik niet) op een redelijk elegante manier, maar grotere vraag is : Waarom zou je dit ooit willen?
- Je komt helemaal in de knoei met je aliassen (welke a.Name wil je hebben als je er 3 hebt in 1 row)
- Je krijgt een variabel aantal kolommen terug...

In wezen zou ik het op 2 manieren aanraden :
- Of je definieert een max aantal a's en doet gewoon tig selfjoins met uitzonderingen zodat je altijd hetzelfde aantal kolommen krijgt (zou ik niet serieus aanraden vanwege performance, maar het werkt wel)
- Of je schrijft het gewoon om zodat je gewoon per row een b-a combinatie terugkrijgt.

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
in sql server heet dit een pivot table... in mysql kun je dit niet eenvoudig oplossen.... zeker niet in 1 query...
je zou via meerdere queries een tijdelijke tabel kunnen vullen, maar dan ben je eigenlijk in je databaselaag aan het oplossen wat je eigenlijk in je programmeerlaag moet oplossen...

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

P.O. Box schreef op zondag 04 mei 2014 @ 17:32:
in sql server heet dit een pivot table... in mysql kun je dit niet eenvoudig oplossen.... zeker niet in 1 query...
In MySQL zou je dan kunnen denken aan GROUP_CONCAT en een split in je programmeercode. Niet bepaald netjes, wél één query.

Ik zou dit echter niet in één query doen. Een query om de bundel op te halen en een om alle additionele bundels erbij te nemen is nou niet bepaald heel spannend voor je database en wordt over het algemeen zelfs prima gecached.

Overigens heb je een beetje een vreemd datamodel. Waarom zijn de basisbundels in een andere tabel ondergebracht dan de additionele bundels? De tabellen zijn exact hetzelfde afgezien van één veldje. Zou ik in één tabel stoppen en dat veld nullable maken. ;)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • mclegodude
  • Registratie: November 2013
  • Laatst online: 13-11 16:28
dankje voor de snelle respons, heb geen invloed op datamodellen, ik lees alleen uit de database.
zou iemand misschien een tekeningetje kunnen maken met de logica hoe ik dat dan zou op kunnen lossen in bijvoorbeeld php (of iets anders).

ik breek hier nu een paar dagen mn hoofd over, de logica lukt me niet bepaald haha

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Wat lukt je niet dan? Je hebt maar twee query's nodig, eentje die het algemene ding ophaalt en eentje die alle bijbehorende additionele bundels ophaalt. Dat is toch niet zo ingewikkeld?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Rotterdammertje
  • Registratie: Juni 2002
  • Laatst online: 28-03-2023
Alle combinaties? Dat kan best snel groeien. In jouw voorbeeld heb je al 90 mogelijke combinaties (ervan uitgaande dat je niet altijd een item uit een deelgroep hoeft te kiezen). Maar als je dit per se wil doen, dan kan je gewoon alle additionele bundels fetchen, en daarna in PHP groeperen op deelgroep id; loop over alle items in deelgroep 1, per item in deelgroep 1 loop je over items in deelgroep 2, per item in deelgroep 2 loop je over items in deelgroep 3, etc.

Maar nogmaals: het aantal combinaties kan heel snel heel groot worden. Waar wil je dit voor gebruiken?

main = putStr (q ++ show q); q = "main = putStr (q ++ show q); q = "


  • mclegodude
  • Registratie: November 2013
  • Laatst online: 13-11 16:28
Ik wil een lijst hebben met alle mogelijke combinaties van additionele bundels naast een hoofdbundel. zodat ik aan elke van die combinaties weer eigen eigenschappen kan hangen.

mijn eigenlijke vraag is nu: hoe krijg ik dan in php al die mogelijke combinaties.

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 20-11 11:59

NMe

Quia Ego Sic Dico.

Haal alle bundels en additionele bundels op in twee losse query's. Vul een arraystructuur door eerst alle records uit de hoofdbundelquery in een associatief array te zetten en daar later met de resultaten uit de tweede array een key aan toe te voegen voor de additionele bundels. Dan is het gewoon een kwestie van een loop in een loop om het af te drukken? Wat lukt daar niet aan?

Als verder bij alle bundels alle additionele bundels mogelijk zijn is dat zelfs niet eens nodig en heb je genoeg aan twee aparte arrays: eentje voor de bundels en eentje voor de additionele bundels. Wederom een dubbele loop verder, waarin je in de binnenste loop gewoon steeds dezelfde additionele bundels doorloopt.

[ Voor 29% gewijzigd door NMe op 06-05-2014 11:28 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • mclegodude
  • Registratie: November 2013
  • Laatst online: 13-11 16:28
de logica om dat te bedenken lukte niet, hartstikke bedankt!
Pagina: 1