[SQL] probleem met het maken van een query *

Pagina: 1
Acties:

  • ocdaan
  • Registratie: Augustus 2001
  • Laatst online: 16-04 13:27

ocdaan

Niet zo zeuren jongens!

Topicstarter
Hey guys,

Ik heb m'n hoofd er ff niet bij en kan niet tot een oplossing komen voor een query.

Let op,

tabel - 2 columns resp 'user_id' en 'mag_id'

Dit is een koppeltabel voor een many to many relatie. We hebben nieuwsbrieven en members. Meerdere members zijn lid van meerder brieven en andersom.

Probleem: ik wil weten hoeveel lezers van brief a ook brief b lezen. enz enz

Dus moet er een query komen die zegt: laat alleen records zien waar de user_id is gelijk en mag_id is bv 2 en 3. Dit zijn dan 2 records die bij elkaar horen, waar de user_id dus gelijk is maar de mag_id 2x verschilt. Het lastige is dat de query naar 2 records tegelijk moet kijken. Ik zat zelf te denken aan een query in een query maar daar ben ik niet zo sterk in.

En om dit in asp te doen lijkt me niet erg handig omdat we zo'n twaalf duizend members hebben en dat script dan uren en uren achter elkaar zou draaien.

Iemand een idee?

Alvast bedankt iig

  • Jaspertje
  • Registratie: September 2001
  • Laatst online: 08-04 12:54

Jaspertje

Max & Milo.. lief

select count(userid) from tabel where mag_id in (2, 3)

Verwijderd

en in welke taal wil je dit dan wél doen? ik vermoed dat het in php wel valt op te lossen met een query en enkele array functies

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL:
1
2
3
4
SELECT User_id, COUNT(*) as Aantal
FROM Tabel
GROUP BY User_ID
HAVING COUNT(*) > 1


Dit geeft alle users die lid zijn van meer dan 1 nieuwsbrief. Wil je dit beperken tot een aantal nieuwsbrief id's moet je nog een WHERE toevoegen met de betreffende IDs.

[ Voor 47% gewijzigd door P_de_B op 24-08-2005 12:43 ]

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


  • ocdaan
  • Registratie: Augustus 2001
  • Laatst online: 16-04 13:27

ocdaan

Niet zo zeuren jongens!

Topicstarter
Om dit via php of asp te doen is geen optie omdat er domweg te veel records zijn (+-175 duizend)

  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Mja, ach, ik neem aan dat je wel wat indexen hebt aangeleged, dan moet een query over een paar integers toch wel te doen zijn? Of je het nou in PHP, ASP of in assembly doet. De query zal je moeten uitvoeren en dat staat overal los van.

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


  • ocdaan
  • Registratie: Augustus 2001
  • Laatst online: 16-04 13:27

ocdaan

Niet zo zeuren jongens!

Topicstarter
Ik denk dat je me verkeerd begrijpt. De result in asp is prima's natuurlijk.

Maar ik dacht eraan om recordset1 (RS1) te openen met alle members bij brief1. Dan een "do while not RS.eof" om door alle records van RS1 te loopen en dan checken (steeds RS2 openen) als de gebruiker van het huidge record ook lid is van brief2. Je snapt dat dit gewoon niet te doen is.

Dit wil ik dus kunnen combineren in een query. We hebben 5 nieuwsbrieven, dus zullen er ook zoveel query's komen??? dus.... er zijn X-aantal members die brief1 lezen maar die ook brief2 lezen, en x-aantal members die brief1 lezen maar ook brief3 lezen enz enz

Het is een nogal onduidelijk verhaal geworden. ik ben sorry ;-) maar ik denk dat de boodschap nu wel duidelijk is.. haahha

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01-05 21:33

.oisyn

Moderator Devschuur®

Demotivational Speaker

ocDaan, zou je voortaan een wat duidelijkere topictitel willen verzinnen, tevens met de taal ervoor in blokhaken? :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
dan doe je zoals in de eerste reply is aangegeven met
SQL:
1
2
3
select count(userid)
from tabel
where mag_id in (2, 3)

en dan voor alle mogenlijke combinaties tussen magazines. Dus dat zijn in het geval van 5 magazines 10 query's en dat zal echt geen probleem zijn lijkt me als je indexen een beetje goed staan.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
rwb schreef op woensdag 24 augustus 2005 @ 13:05:
dan doe je zoals in de eerste reply is aangegeven met
SQL:
1
2
3
select count(userid)
from tabel
where mag_id in (2, 3)

en dan voor alle mogenlijke combinaties tussen magazines. Dus dat zijn in het geval van 5 magazines 10 query's en dat zal echt geen probleem zijn lijkt me als je indexen een beetje goed staan.
Dit geeft het aantal user dat lid is van nieuwsbrief 2, nieuwsbrief 3 of beide. Dat is niet de vraag volgens mij.

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


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
P_de_B schreef op woensdag 24 augustus 2005 @ 13:08:
[...]


Dit geeft het aantal user dat lid is van nieuwsbrief 2, nieuwsbrief 3 of beide. Dat is niet de vraag volgens mij.
Je hebt gelijk. Niet goed gelezen.
deze query zou dan wel beter moeten werken.
SQL:
1
2
3
4
select count( userid )
from tabel
where magid = 2
and userid in ( select userid from tabel where magid = 3 )

[ Voor 25% gewijzigd door Woy op 24-08-2005 13:15 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
rwb schreef op woensdag 24 augustus 2005 @ 13:13:
[...]

Je hebt gelijk. Niet goed gelezen.
deze query zou dan wel beter moeten werken.
SQL:
1
2
3
4
select count( userid )
from tabel
where magid = 2
and userid in ( select userid from tabel where magid = 3 )
Dit geeft het nog alleen maar voor users die 2 en 3 hebben. Wat dacht je van users die 2 en 4, 3 en 4, 4 en 1, 8 en 13 hebben?

Volgens mij was heel concreet de vraag: welke users hebben een abonnement op meer dan 1 nieuwsbrief. De goede query daarvoor heb ik al gepost volgens mij.

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


  • RayNbow
  • Registratie: Maart 2003
  • Laatst online: 18:00

RayNbow

Kirika <3

SQL:
1
2
3
4
SELECT COUNT( * ) 
FROM tabel AS t1 INNER JOIN tabel AS t2
ON t1.user_id = t2.user_id
WHERE t1.mag_id =1 AND t2.mag_id =2 

Dit zou moeten werken, mits (user_id, mag_id) uniek is.

Ipsa Scientia Potestas Est
NNID: ShinNoNoir


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
P_de_B schreef op woensdag 24 augustus 2005 @ 13:18:
[...]


Dit geeft het nog alleen maar voor users die 2 en 3 hebben. Wat dacht je van users die 2 en 4, 3 en 4, 4 en 1, 8 en 13 hebben?

Volgens mij was heel concreet de vraag: welke users hebben een abonnement op meer dan 1 nieuwsbrief. De goede query daarvoor heb ik al gepost volgens mij.
Wat ik ervan begreep is dat hij het aantal users wil weten wat zowel 2 en 3 leest en dan apart bijvoorbeeld hoeveel users die 2 lezen ook 4 lezen.
Als het gewoon zo is dat hij wil weten hoeveel users meerdere tijdschriften lezen dan heb jij inderdaad de goede query gepost.

Maar zoals ik het lees wil hij daadwerkelijk de relatie tussen 2 nummers weten.

SQL:
1
2
3
4
5
6
select count( distinct t1.userid ) as aantal, t1.magid, t2.magid
from test t1
inner join test t2
on t1.userid = t2.userid
and t1.magid > t2.magid
group by t1.magid, t2.magid

deze query levert per koppel magazines volgens mij het aantal wat op beide is geabbonneerd

[ Voor 17% gewijzigd door Woy op 24-08-2005 14:28 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • ocdaan
  • Registratie: Augustus 2001
  • Laatst online: 16-04 13:27

ocdaan

Niet zo zeuren jongens!

Topicstarter
Ik ben er nog niet helemaal uit, morgen ga ik even verder, heb ik ook wat meer tijd.

Heel erg bedankt voor jullie input allemaal iig ;-)

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Wat wil je nou eigenlijk precies want dat is mij nou nog niet precies duidelijk. Wil je zoals P_de_B zegt het aantal users dat op 2 of meer magazines is geaboneerd of wil je per paar magazines ( dus bijvoorbeeld 1 en 2 ) weten hoevel users op die 2 magazines is geaboneerd.

Of wil je bij een paar magazines weten welke users op beide geaboneerd zijn?

De query die ik hierboven geef die geeft ieder geval van alle combinaties van 2 magazines het aantal users dat op beide geabonneerd is ( Mits er minstens een iemand geabboneerd is op die 2 )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Verwijderd

rwb schreef op woensdag 24 augustus 2005 @ 18:11:
Wat wil je nou eigenlijk precies want dat is mij nou nog niet precies duidelijk.
Zoals ik het interpreteer een soort statistisch overzicht.

--
Hersenspinsel: Wellicht dat je gebruik kan maken van een permutatietabel met alle mogelijke combinaties van tijdschriften (volgorde niet belangrijk). En daar iets mee doen?

edit:
volgens mij is volgorde wel belangrijk, i.v.m. interpretatie van de statistieken

[ Voor 11% gewijzigd door Verwijderd op 25-08-2005 02:30 ]


  • ocdaan
  • Registratie: Augustus 2001
  • Laatst online: 16-04 13:27

ocdaan

Niet zo zeuren jongens!

Topicstarter
.oisyn schreef op woensdag 24 augustus 2005 @ 13:00:
ocDaan, zou je voortaan een wat duidelijkere topictitel willen verzinnen, tevens met de taal ervoor in blokhaken? :)
idd, ik vergeet dat nog wel eens.... sorry O-)

  • ocdaan
  • Registratie: Augustus 2001
  • Laatst online: 16-04 13:27

ocdaan

Niet zo zeuren jongens!

Topicstarter
Ja idd, Een statistieken pagina.

// edit - zat te denken aan een matrix achtige oplossing maar ik vraag me af of dat handig is....

rwb, ik denk dat je hebt gelijk hebt - daadwerkelijke nummers tussen 2 magazines

[ Voor 79% gewijzigd door ocdaan op 25-08-2005 00:14 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
de query die ik geschreven heb geeft al een overzicht van het aantal mensen dat geaboneerd is op 2 verschillende tijdschriften per combinatie van tijdschriften. Als je het later uit wilt breiden naar 3 tijdschriften zul je nog een extra join moeten doen.

Maar wat meestal zo met programmeren het probleem is: Omschrijf eerst eens duidelijk met woorden wat je wil. Als je dat duidelijk gedaan hebt is het meestal al een stuk makkelijker om daar de oplossing voor te vinden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1