2014-12-06 45 views
0

我有以下MySQL查詢:使用都存在,並在MySQL查詢簡單的值進行覈對

SELECT * FROM posts p WHERE 
    EXISTS (
     SELECT 1 FROM following f WHERE f.from = 2 AND f.to = p.uid 
    ) 
    OR p.uid = 2 

我希望它從posts其中following有記錄WHERE f.from = 2 AND f.to = p.uid以及所有記錄,其中p.uid = 2返回的所有記錄。

如果我先檢查存在檢查,則只有與存在匹配的記錄纔會返回。如果我只將它們交換到匹配p.uid = 2返回的記錄。

+0

與所需的輸出一起提供一些樣本數據,您可以在SELECT子句中添加distinct。 – 2014-12-06 09:34:13

+0

我已檢查過您的查詢,並且似乎這兩個版本都可以正常工作,無論where子句中的條件順序如何,請參閱此演示:http://sqlfiddle.com/#!2/6b098/3查詢返回完全相同的結果。 – krokodilko 2014-12-06 11:12:40

回答

0

您可以使用計數來代替:

SELECT 
    * 
FROM 
    posts p 
WHERE 
    (SELECT count(*) FROM following f WHERE f.from = 2 AND f.to = p.uid) > 0 
    OR p.uid = 2 

你覺得呢?

+0

這與以前的嘗試有相同的問題。前一種說法因某種原因而優先。 – miestasmia 2014-12-06 09:25:15

+1

EXSTS比COUNT(*)更快,閱讀本文:http://sqlmag.com/t-sql/exists-vs-count – krokodilko 2014-12-06 09:25:22

0

另一個計算策略:

SELECT P.* 
FROM POSTS P 
LEFT JOIN FOLLOWING F ON F.to=P.uid 
WHERE P.uid=2 OR F.from=2 

如果需要