Toon posts:

[MySQL] Omgedraaid resultaat

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een probleempje met een query.

Ik heb twee tabellen te weten gebruikers en groep_koppel.
Nu is groep_koppel gewoon een tabel die de link gaat leggen tussen groepen en gebruikers.

Deze tabel bestaat dus uit een groep_id en gebruiker_id.
De tabel gebruikers bestaat uit gebruiker_id, naam, etc....

Wanneer ik nu bijvoorbeeld 2 groepen heb en een paar gebruikers dan wil ik een overzicht kunnen ophalen van alle gebruikers dit niet in groep 1 zitten.

Wanneer ik drie gebruikers heb bijvoorbeeld 1 - 2 - 3 en alleen gebruiker 1 zit in de groep 1 dan wil ik gebruiker 2 en 3 zien. Wanneer er nu in groep 2 helemaal geen gebruikers zitten dan wil ik de gebruikers 1 - 2 - 3 te zien krijgen.

Ik heb nu de volgende query

PHP:
1
2
3
4
5
SELECT abonnee.abonnee_id
FROM abonnee
LEFT  JOIN abonnees_per_groep
USING ( abonnee_id ) 
WHERE abonnees_per_groep.abonnee_id IS  NULL


Deze query werkt voor de eerste stelling wel goed maar dat lijkt maar want als er groep 2 gekozen is dan krijg je alsnog 2 en 3 te zien en niet 1.

Ik kan ook nergens een groep_id meegeven want deze is in die gevallen ook altijd NULL.

Het probleem is dus dat dit wel met een subquery op te lossen is maar dit mag dus niet in MySQL.
Wie heeft er een andere goede oplossing voor me, of moet ik dit echt op gaan splitsen, dit is een nadeel omdat er uiteindelijk veel gebruikers en veel groepen kunnen gaan komen.

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 21-08 18:29
In mysql is het vaak sneller om 2 simpele query's te doen dan 1 ingewikkelde maar dat zul je moeten benchmarken.

Ik zou sowieso graag eens willen weten waar je dit voor nodig hebt, want dit is niet zomaar standaard.

Ik heb even zitten kijken maar ik zou zo niet kunnen bedenken hoe je dit op kunt lossen. Je kunt natuurlijk wel gewoon alles ophalen en dan in PHP bepaalde groepen verbergen.

Het probleem waar ik mee zit is dat je geen group by kunt doen. Anders zou je een if statement kunnen doen waarin je kijkt hoeveel de count op heeft geleverd en welke group je nu hebt.

Verwijderd

Topicstarter
Ik heb het nodig voor een losstaande koppeling om alsnog op een later tijdstip gebruikers wel aan de bepaalde groepen te koppelen.
Nu ben ik het ook in de twee losstaande aan het maken maar ja op het moment dat je naar de paar duizend gebruikers gaat dan is het volgens mij in MySQL sneller als MySQL - PHP MySQL.

Maar idd ik heb ook geen manier kunnen vinden.....

  • 0528973
  • Registratie: Juni 2003
  • Laatst online: 15-05-2013
/***************************************************************/
Indien je idd zeer veel gebruikers hebt, zou je de database kunnen optimaliseren
met indexes, primary keys en dat soort zaken. Misschien dat je dit in MYSQL
zelf met een ingewikkelde query kan oplossen, zo ja zou je deze dan willen
plaatsen want daar ben ik dan zeer in geinteresseerd :)
/***************************************************************/

Hey,

Je kan toch ook je subquery opsplitsen in 2 queries?
En deze elk apart het benodigde aantal keren uitvoeren, totdat je de gegevens hebt die je wilt? Doe zoiets als
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
//Zorg voor een Database connectie

//gewoon even de verzameling gebruikers voorstellen, 
waarbij bepaald moet worden welke gebruikers in groep 1 zitten
$gebruikers = array('1', '2', '3');

$groep1 = array();

foreach($gebruikers as $gebruiker)
{
$query = "SELECT * FROM groep_koppel WHERE gebruikersnaam = '".$gebruiker."'";
$result = mysql_query($query) or die(mysql_error());
$result = mysql_fetch_array($result, MYSQL_ASSOC);
if($result[groep_koppel_groepid] === "1")
   $groep1[] = $gebruiker;
}
if(count($groep1) === 0)
{
//Gebruiker 1,2 & tonen
}
else 
{
//alles uit $groep1 tonen
}

[ Voor 33% gewijzigd door 0528973 op 18-08-2003 10:57 ]

Pascal


  • whoami
  • Registratie: December 2000
  • Laatst online: 21-08 22:54
Je zult met NOT IN aan de slag moeten gaan.

MySQL ondersteund dan wel geen subqueries, maar je kan bv. eerst de gebruikers-id's ophalen van de gebruikers die in groep 2 zitten.
Die id's zet je dan in een komma-separated string en gebruik je dan in je NOT IN clausule:

code:
1
2
3
SELECT ....
FROM ...
WHERE id NOT IN ( 1, 2)

https://fgheysels.github.io/


Verwijderd

Topicstarter
Is dus precies wat ik nu ook aan het doen ben ;)
PHP:
1
2
3
4
5
SELECT *
FROM abonnee
WHERE abonnee_id NOT IN (LIJST KOMEN)
OR afgemeld_op IS NOT NULL
GROUP BY abonnee_id

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

code:
1
2
3
4
5
6
SELECT abonnee.abonnee_id
FROM abonnee
LEFT  JOIN abonnees_per_groep
USING ( abonnee_id )
GROUP BY abonnee.abonnee_id
HAVING SUM(abonnees_per_groep.group_id = 2) = 0

En probeer eens wat creatiefs met zoiets? Dus de abonnees bij hun id grouperen en dan vervolgens optellen hoevaak ze in groep 2 zitten. Als dat 0 is, dan zitten ze geen keer in groep 2 -> wat jij wilde weten.

Ik gooi dit zo uit mijn mouw, dus heb het niet getest en ga dat ook niet doen, maar wellicht heb je er wat aan :)
Pagina: 1