[MySQL] Select iedereen die alleen in groep 1 of 2 zit

Pagina: 1
Acties:

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13-05 12:45
Goed, een SELECT-probleem.
Ik heb 3 tabellen

- ontvangers
2 kolommen, ID en EMAIL

- doelgroepen
2 kolommen, ID en DOELGROEP

- ontvangersingroepen
2 kolommen, ONTVANGERS_ID en DOELGROEP_ID

Een voorbeeld van de inhoud van deze 3de tabel is bijvoorbeeld
ontvangers_IDdoelgroep_ID
11
12
21
23


Oftewel, persoon 1 is opgenomen in groep 1 en 2, en persoon 2 is opgenomen in groep 1 en 3.

Nu komt het probleem. Ik wil de personen selecteren, die 'alleen' in groep 1 of 2 voorkomen, dus niet in groep 3, of een andere groep.
De bedoeling is dus om te zien welke personen 'groeploos' worden als ik groep 1 en 2 zou verwijderen. In dit geval is dat dus alleen persoon 1, want persoon 2 zit nog in groep 3.

Ik heb al wat zitten klooien met count's, group by's, en joins van deze tabel met zichzelf.. maar kom er maar neit uit. Nu ben ik nog niet zo een mysql expert, maar ik heb het gevoel dat dit makkelijk te doen is in 1 query..

Wie laat me het licht zien? Het klinkt zo simpel maar ik kom er gewoon niet uit :S

[ Voor 16% gewijzigd door frickY op 04-02-2005 14:44 ]


Verwijderd

Hoi,

Ik snap niet geheel je probleem maar ik zou zoiets proberen.

Select ontvangers_id from ontvangersingroepen where doelgroepen_id = 1 or doelgroepen_id = 2 group by ontvangers_id;

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 22-03 18:12
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
SELECT
  o.*
FROM
  ontvangers o
JOIN
  ontvangersingroepen a
ON
  o.ID = a.ONTVANGERS_ID
WHERE
  a.DOELGROEP_ID = 1
OR
  a.DOELGROEP_ID = 2
AND
  COUNT(
    SELECT
      o.*
    FROM
      ontvangers o
    JOIN
      ontvangersingroepen a
    ON
      o.ID = a.ONTVANGERS_ID
    WHERE
      a.DOELGROEP_ID != 1
    AND
      a.DOELGROEP_ID != 2
  ) = 0


edit: en nu netjes ;)

edit2: sub query erbij (je moet wel 4.* hebben dacht ik, anders worden subqueries niet ondersteund)

[ Voor 82% gewijzigd door Michali op 04-02-2005 14:40 ]

Noushka's Magnificent Dream | Unity


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13-05 12:45
Maar dan selecteer ik persoon 2 ook, en persoon 2 hoeft niet geselecteerd te worden want hij zit nog veilig in groep 3.
frickY schreef op vrijdag 04 februari 2005 @ 14:18:
De bedoeling is dus om te zien welke personen 'groeploos' worden als ik groep 1 en 2 zou verwijderen. In dit geval is dat dus alleen persoon 1, want persoon 2 zit nog in groep 3.
Ik zei toch dat het lastiger was dan dat het leek :?

edit*
Ik ben helaas gebonden aan MySQL 3.23.52

[ Voor 55% gewijzigd door frickY op 04-02-2005 14:43 ]


  • BHR
  • Registratie: Februari 2002
  • Laatst online: 10-05 12:16

BHR

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT o.*
FROM ontvangers o
WHERE o.ID IN
(
SELECT aIN.ONTVANGERS_ID
FROM ontvangersingroepen aIN
WHERE aIN.DOELGROEP_ID = 1
OR aIN.DOELGROEP_ID = 2
)
AND o.ID NOT IN
(
SELECT aNOTIN.ONTVANGERS_ID
FROM ontvangersingroepen aNOTIN
WHERE aNOTIN.DOELGROEP_ID != 1
AND aNOTIN.DOELGROEP_ID != 2
)



code:
1
2
3
4
5
6
7
8
9
10
SELECT o.*o
FROM ontvangers o, ontvangersingroepen aIN

LEFT JOIN ontvangersingroepen aNOTIN
ON o.ID = aNOTIN.ONTVANGERS_ID
AND aNOTIN.DOELGROEP_ID != 1
AND aNOTIN.DOELGROEP_ID != 2

WHERE o.ID = aIN.ONTVANGERS_ID
AND aNOTIN.ONTVANGERS_ID IS NULL


Uit blote hoofd getypt, dus weet ik niet zeker of deze werkt.
/edit
ach, mysql3, wellicht kun je query2 proberen ;D

[ Voor 5% gewijzigd door BHR op 04-02-2005 14:48 . Reden: langzaam getypt.. ]

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


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Klein foutje in de 2e query van BHR, het principe klopt wel helemaal volgens mij :)

code:
1
2
3
4
5
SELECT DISTINCT o.ontvangerId
FROM ontvangers O
INNER JOIN ontvangersingroepen oig1 ON o.ontvangerId = oig1.ontvangerid
LEFT OUTER JOIN ontvangersingroepen oig2 ON o.ontvangerid = oig2.ontvangerid AND oig2.groepId NOT IN (1,2)
WHERE oig2.groepid IS NULL

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


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13-05 12:45
De 2de zag er veel belovend uit, maar geeft geen results terug :(

In principe ben ik gewoon opzoek naar het tegenover gestelde van
code:
1
WHERE (groupID != 1 AND groupID != 2)

Maar
code:
1
WHERE (groupID = 1 AND groupID = 2)

werkt natuurlijk niet :+

Ik doe het zolang even met 2 querys.. maar ben toch erg nieuwsgierig naar wat de juiste manier nou is. Dit moet toch gewoon mogelijk zijn??

@P_de_B
Ook daarmee geen results ;( Maar dat kan komen omdat ik andere tabel en kolom namen gebruik als in het voorbeeld. Dus msischien dat ik een foutje bij het overtikken heb gemaakt. Ik ga het nog een keer proberen
> Helaas, nog steeds geen results.

[ Voor 26% gewijzigd door frickY op 04-02-2005 15:18 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Heb je mijn iets aangepast versie ook geprobeerd? Ik vergis me heel sterk als die niet werkt

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


  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-05 18:53

Bosmonster

*zucht*

nm... niet goed gelezen :)

[ Voor 168% gewijzigd door Bosmonster op 04-02-2005 15:19 ]


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13-05 12:45
@Bosmonster
toch leuk geprobeerd ;)

[ Voor 70% gewijzigd door frickY op 04-02-2005 15:20 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Net even getest:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
create table #ontvangers (ontvangerid int)

insert into #ontvangers (ontvangerid)  values  (1)
insert into #ontvangers (ontvangerid)  values  (2)

create table #ontvangersingroepen (ontvangerid int, groepid int)

insert into #ontvangersingroepen (ontvangerid , groepid) values (1,1)
insert into #ontvangersingroepen (ontvangerid , groepid) values (1,2)
insert into #ontvangersingroepen (ontvangerid , groepid) values (2,1)
insert into #ontvangersingroepen (ontvangerid , groepid) values (2,3)

SELECT DISTINCT o.ontvangerId
FROM #ontvangers O
INNER JOIN #ontvangersingroepen oig1 ON o.ontvangerId = oig1.ontvangerid
LEFT OUTER JOIN #ontvangersingroepen oig2 ON o.ontvangerid = oig2.ontvangerid AND oig2.groepId NOT IN (1,2)
WHERE oig2.groepid IS NULL


Dit geeft 1 rij terug, met ontvangerId 1, of snap ik het nu niet goed?

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


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13-05 12:45
Nee, dat klinkt als een goed resultaat. Alleen receiverID gaat problemen geven na het verwijderen van groep 1 en 2, omdat deze dan geen groep meer heeft.

Mijne echte tabellen;
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
- ontvangers
CREATE TABLE mailing_receivers (
  ID int(5) unsigned NOT NULL auto_increment,
  name varchar(50) default NULL,
  email varchar(255) default NULL,
  PRIMARY KEY  (ID)
) TYPE=MyISAM;

- doelgroepen
CREATE TABLE mailing_groups (
  ID int(5) unsigned NOT NULL default '0',
  name varchar(100) NOT NULL default '',
  PRIMARY KEY  (ID)
) TYPE=MyISAM;

- ontvangersingroepen
CREATE TABLE mailing_receiver_groups (
  receiverID int(5) unsigned NOT NULL default '0',
  groupID int(5) unsigned NOT NULL default '0'
) TYPE=MyISAM;

[ Voor 67% gewijzigd door frickY op 04-02-2005 15:39 ]


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
frickY schreef op vrijdag 04 februari 2005 @ 15:33:
Nee, dat klinkt als een goed resultaat. Alleen receiverID gaat problemen geven na het verwijderen van groep 1 en 2, omdat deze dan geen groep meer heeft.
ehm :?

Wat bedoel je precies?

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


  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

code:
1
2
3
4
5
6
SELECT o.id
FROM ontvangers o
JOIN ontvangerInGroup oig1 ON o.id = oig1.ontvangerid AND oig1.id IN (1, 2)
LEFT JOIN ontvangerInGroup oig_overig ON o.id = oig_overig.ontvangerid AND oig_overig.id NOT IN(1,2)
GROUP BY o.id
HAVING COUNT(oig_overig.id) = 0

Wellicht kan het met zoiets

edit:

1 join is genoeg

[ Voor 15% gewijzigd door ACM op 04-02-2005 15:46 ]


  • frickY
  • Registratie: Juli 2001
  • Laatst online: 13-05 12:45
Sorry, niet helemaal helder :D
De bedoeling van de query was dus de receiverID's ophalen welke na een delete van groep 1 en 2 niet meer in een groep zouden zitten. En dat is precies wat jouw query doet.
Oftewel :9~ ! Alleen ik snap niet waarom hij bij mij niets terug gaf :S

Heb nu jouw table-structure even geprobeerd, en wordt nu getrakteerd op een;
- Unknown table 'o' in field list
Kan jouw Mysql iets wel wat de mijne niet kan?

Heb de aliassen vervangen met de volledige tabelnaam en nu draait het wel. Alleen nu vinden mn collega's me raar omdat dit "veel makkelijker is met 2 querys"...
Zijn er redenen, buiten leesbaarheid van de code, om dit te splitsen naar 2 query's waarbij je wat puzzelwerk met PHP doet in plaats van de gegeven oplossing?

* frickY gaat even 2 loopjes draaien om parsetimes te vergelijken

[ Voor 59% gewijzigd door frickY op 04-02-2005 16:19 ]

Pagina: 1