2012-05-12 4 views
0

Je souhaite sélectionner toutes les lignes où WHERE (uid = {$uid} OR uid = **HERE**)**HERE** correspond à cid s récupéré à partir de la requête 2 ci-dessous.Comment combiner ces deux requêtes de sélection avec un cas

Requête 1:

SELECT * FROM `t_activities` 
    WHERE (`uid` = {$uid} OR `uid` = **HERE**) 
    AND `del` = 0 
    GROUP BY `fid` 
    ORDER BY `time` DESC 
    LIMIT 10 

Et Requête 2:

SELECT `cid` FROM `t_con` WHERE `uid` = {$uid} AND `flag` = 1 

Répondre

2
SELECT * FROM `t_activities` 
WHERE (`uid` = {$uid} OR `uid` in (SELECT `cid` 
            FROM `t_con` 
            WHERE `uid` = {$uid} AND `flag` = 1)) 
AND `del` = 0 
GROUP BY `fid` 
ORDER BY `time` DESC 
LIMIT 10 
+0

Comment s'appelle cette méthode? Je cherchais 'Joins', 'left join', 'Inner join' etc mais je n'ai pas réussi à le comprendre. Merci ça marche. – ptamzz

+1

C'est ce qu'on appelle une «sous-requête» –

1

Vous pouvez le faire comme s'y joindre:

SELECT * 
FROM `t_activities` ta left outer join 
    (SELECT `cid` 
     FROM `t_con` 
     WHERE `uid` = {$uid} AND `flag` = 1) 
    ) tc 
    on ta = tc.cid 
WHERE (`uid` = {$uid} OR tc.`uid` is not null) AND `del` = 0 
GROUP BY `fid` 
ORDER BY `time` DESC 
LIMIT 10 

Par ailleurs, comme une instruction SQL le "GROUP BY fid" semble très étrange. Ceci est autorisé dans mysql, mais je pense que c'est une mauvaise pratique. Il est beaucoup mieux d'être explicite sur ce que vous faites:

SELECT fid, min(<field1>) as Field1, . . . 

Cela permet d'éviter des erreurs lorsque vous revenez à la requête ou essayez de la modifier.

Questions connexes