2012-05-12 54 views
0

我想要選擇所有行,其中**HERE**cid從下面的查詢2中撤回的所有行。如何將這兩個Select查詢與OR情況相結合

查詢1:

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

和查詢2:

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

回答

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

這種方法叫什麼?我正在尋找'聯接','左連接','內部連接'等,但無法弄清楚。感謝它的工作。 – ptamzz

+1

它被稱爲「子查詢」 –

1

你可以做到這一點的加入,以及:

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 

順便說一句,作爲一個SQL語句「GROUP BY fid」看起來很奇怪。這在MySQL中是允許的,但我認爲這是一種不好的做法。明確你所做的事情要好得多:

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

這有助於防止返回查詢或嘗試修改它時發生的錯誤。