Toon posts:

[MySQL] Resulaten van een query gebruiken als `WHERE` claus

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik begin gelijk maar even met een voorbeeld van wat ik zou willen.

Query 01
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
SELECT 
    `websites`.*,
    `users`.`uLoginname`
FROM 
    `websites`
    
INNER JOIN
    `users`
ON
    `users`.`uID` = `websites`.`wUID`
    
WHERE `wUID` = (resulaten uit query 2)


Query 02
SQL:
1
2
3
4
5
6
7
8
SELECT
    `rbac_user_management`.`userID`
FROM 
    `rbac_user_management`
WHERE 
    `rbac_user_management`.`userID` = 'int'
OR 
    `rbac_user_management`.`resellerID` = 'int'


Heeft iemand enig idee hoe ik van deze twee queries één query kan maken? Ik maak gebruik van een MySQL 4.0.18 server.

Met vriendelijke groet,
Pherion

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 16:25
code:
1
2
3
4
5
6
7
8
9
10
...
WHERE `wUID` IN (SELECT 
    `rbac_user_management`.`userID` 
FROM  
    `rbac_user_management` 
WHERE  
    `rbac_user_management`.`userID` = 'int' 
OR  
    `rbac_user_management`.`resellerID` = 'int'
)

"IN" keyword dus.

Edit: volgens mij kan het ook nog wel door `users`.`uID` te joinen op `rbac_user_management`.`userID`

[ Voor 20% gewijzigd door sig69 op 14-08-2006 14:30 ]

Roomba E5 te koop


  • Pyrus
  • Registratie: November 2001
  • Laatst online: 07-02 10:16

Pyrus

Hardknock life

Dat gaat niet werken sig69, Pherion gebruikt een versie van MySQL waar geen subqueries in ondersteund worden. Subqueries zitten er pas in vanaf 4.1 en hoger.

LinkedIn


Verwijderd

Topicstarter
sig69 schreef op maandag 14 augustus 2006 @ 14:28:
code:
1
2
3
4
5
6
7
8
9
10
...
WHERE `wUID` IN (SELECT 
    `rbac_user_management`.`userID` 
FROM  
    `rbac_user_management` 
WHERE  
    `rbac_user_management`.`userID` = 'int' 
OR  
    `rbac_user_management`.`resellerID` = 'int'
)

"IN" keyword dus.

Edit: volgens mij kan het ook nog wel door `users`.`uID` te joinen op `rbac_user_management`.`userID`
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SELECT 
    `websites`.*,
    `users`.`uLoginname`
FROM 
    `websites`
    
INNER JOIN
    `users`
ON
    `users`.`uID` = `websites`.`wUID`
    
WHERE `wUID` IN
(
    SELECT 
        `rbac_user_management`.`userID` 
    FROM  
        `rbac_user_management` 
    WHERE  
        `rbac_user_management`.`userID` = '2' 
    OR  
        `rbac_user_management`.`resellerID` = '2'
)


Geeft de volgende ouput:
#1064 - You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT
`rbac_user_management`.`userID`
FROM
:?

Edit : Bedankt Pyrus, enig idee hoe ik het kan oplossen?

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 16:25
Sorry, had niet naar de versie gekeken idd. Is het geen optie om te upgraden?
Ander zou je in je applicatie eventueel eerst de benodigde id's ophalen, en die in je eerste query plakken.
Je zou nog kunnen kijken of zoiets werkt, dat durf ik niet te zeggen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT  
    `websites`.*, 
    `users`.`uLoginname` 
FROM  
    `websites` 
     
INNER JOIN 
    `users` 
ON 
    `users`.`uID` = `websites`.`wUID` 
     
INNER JOIN

        `rbac_user_management`  
ON
    
    `rbac_user_management`.`userID` = users`.`wUID`
    AND
    (
        `rbac_user_management`.`userID` = '2'  
    OR   
        `rbac_user_management`.`resellerID` = '2'
    )

Wat overigens op mij vreemd overkomt is dit:
code:
1
2
3
4
5
6
    SELECT  
        `rbac_user_management`.`userID`  
    FROM   
        `rbac_user_management`  
    WHERE   
        `rbac_user_management`.`userID` = '2'...

Dit haalt altijd 2 op lijkt mij?

Roomba E5 te koop


  • Pyrus
  • Registratie: November 2001
  • Laatst online: 07-02 10:16

Pyrus

Hardknock life

Heel kort door de bocht: MySQL updaten :P

Minder kort door de bocht: je tweede query in php ofzo laten uitvoeren, uitkomsten daarmee in een string plaatsen als: (1,12,13,1337) en die dan achter je query plakken als
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
    `websites`.*,
    `users`.`uLoginname`
FROM 
    `websites`
    
INNER JOIN
    `users`
ON
    `users`.`uID` = `websites`.`wUID`
    
WHERE websites.`wUID` IN 
(1,12,13,1337)


Redelijk ruim door de bocht: nog een join maken met je rbac_user_management tabel en dan gewoon die reseller_id in de where clause erbij proppen ofzo? Ik neem tenminste aan dat die 'int' in je tweede query bedoeld is om aan te geven dat het een integer is....

edit:
Zwaait naar boven :w gamma :)

LinkedIn


Verwijderd

Topicstarter
Pyrus schreef op maandag 14 augustus 2006 @ 14:57:
Heel kort door de bocht: MySQL updaten :P

Minder kort door de bocht: je tweede query in php ofzo laten uitvoeren, uitkomsten daarmee in een string plaatsen als: (1,12,13,1337) en die dan achter je query plakken als
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
SELECT 
    `websites`.*,
    `users`.`uLoginname`
FROM 
    `websites`
    
INNER JOIN
    `users`
ON
    `users`.`uID` = `websites`.`wUID`
    
WHERE websites.`wUID` IN 
(1,12,13,1337)


Redelijk ruim door de bocht: nog een join maken met je rbac_user_management tabel en dan gewoon die reseller_id in de where clause erbij proppen ofzo? Ik neem tenminste aan dat die 'int' in je tweede query bedoeld is om aan te geven dat het een integer is....

edit:
Zwaait naar boven :w gamma :)
Ik denk dat ik vrede neem met jouw 'minder kort door de bocht' versie. Bedankt voor jullie hulp :*)!

Verwijderd

Ik doe het met een loop:
code:
1
2
3
4
5
6
7
$query_Recordset1 = sprintf("SELECT  `rbac_user_management`.`userID` FROM  rbac_user_management` WHERE  `rbac_user_management`.`userID` = 'int' OR `rbac_user_management`.`resellerID` = 'int' );

$array1 = $Recordset1->GetArray();
$n2 = count($array1);

for ($i2=0; $i2<$n2; $i2++) {
$variabele = $array1[$i2][0] ;

Met het resultaat uit deze query gaan we elke keer zoeken in de volgende query. Je moet wel bij $array1[$i2][0] de juiste offset kiezen. Dus de 0 eventueel vervangen door 1 of een ander getal.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$query_Recordset2 = sprintf("SELECT 
    `websites`.*,
    `users`.`uLoginname`
FROM 
    `websites`
    
INNER JOIN
    `users`
ON
    `users`.`uID` = `websites`.`wUID`
    
WHERE `wUID` =%s'", $variabele);

while (!$Recordset2->EOF) {
$WatIkZoek= $Recordset2->Fields('VELDNAAM');
$Recordset2->MoveNext(); 
  }


Of het slim is weet ik niet, maar dit was het eerste wat in mij opkwam toen ik een vergelijkbaar probleem had. En het werkt. Maar het kan natuurlijk erg langzaam werken?

  • sig69
  • Registratie: Mei 2002
  • Laatst online: 16:25
Op deze manier voer je voor elke gevonden userID in je eerste query nog een query uit op je database. Als je alle userID's in één keer in een "wUID IN ( ... )" statement gooit, is dit vele malen efficienter.

Roomba E5 te koop

Pagina: 1