2015-01-17 17 views
0

我試圖在聯接查詢中添加一個新案例,但它不影響結果。多個案例的內部聯接查詢

我有一個用戶帖子的表,查詢檢查誰是用戶的朋友(通過user_id),然後檢查帖子是否被標記了5次或更多次。 '直到這裏工作正常。我希望現在檢查帖子是否公開。所以在這種情況下,它應該忽略友誼情況。

工作查詢新增加的情況下才:

$sql = "SELECT COUNT(*) AS count_posts 
     FROM mutamba_posts 
     INNER JOIN 
     (
      SELECT aluno_id 
      FROM mutamba_amigos 
      WHERE mutamba_amigos.amizade_id IN 
      (
       SELECT amizade_id FROM mutamba_amigos WHERE aluno_id = '{$myid}' 
      ) 
      GROUP BY aluno_id 
     ) mutamba_amigos ON mutamba_amigos.aluno_id = mutamba_posts.aluno_id 
     WHERE mutamba_posts.post_flags < 5 
     ORDER BY mutamba_posts.post_date DESC"; 

添加的新情況檢查(什麼都不做)後:

$sql = "SELECT * 
FROM mutamba_posts 
INNER JOIN 
(
    SELECT aluno_id 
    FROM mutamba_amigos 
    WHERE mutamba_amigos.amizade_id IN 
    (
     SELECT amizade_id FROM mutamba_amigos WHERE aluno_id = '{$myid}' 
    ) 
    GROUP BY aluno_id 
) mutamba_amigos ON mutamba_amigos.aluno_id = mutamba_posts.aluno_id 
WHERE mutamba_posts.post_flags < 5 
    OR (mutamba_posts.post_visibility = 'show_all' AND mutamba_posts.post_flags < 5) 
ORDER BY mutamba_posts.post_date DESC 
LIMIT {$start}, {$limit}"; 

會明白任何幫助。

編輯2:我很抱歉花了很長時間回來,我不在。

這裏是我的表格和一些示例數據。

帖子TBL:

post_id| aluno_id | post_text | post_flags | post_visibility |post_date 

--69---|-----9----|Hello world|------0-----|------show_all-- |2015-01-19  
--70---|-----2----|Hi friends |------0-----|------friends----|2015-01-19 
--71---|-----1----|somedays.. |------2-----|------friends----|2015-01-19 

友誼TBL:

id | aluno_id | amizade_id | bloqueado | date 
24 |----2-----|-----33-----|-----0-----|2015-01-02 
25 |----1-----|-----34-----|-----0-----|2015-01-02 
26 |----1-----|-----35-----|-----0-----|2015-01-02 
27 |----2-----|-----35-----|-----0-----|2015-01-02 
28 |----9-----|-----36-----|-----0-----|2015-01-02 

預期的輸出,學生1和2(aluno_id 1和aluno_id 2)將能夠看到自己的崗位,因爲他們是朋友和學生9 aluno_id 9的帖子,因爲它設置爲show_all。然而學生9 aluno_id 9只能看到他自己的帖子,因爲他沒有朋友。

+0

'其中x OR(Y和X)'相同'WHERE x'。 – Barmar

回答

1

在查詢中的問題是您正在檢查mutamba_posts.post_visibility = 'show_all' and mutamba_posts.post_flags < 5

要刪除mutamba_posts.post_flags < 5當可見性爲public時,您不能在它們之間使用and運算符,而使用OR運算符。嘗試這個。

SELECT * 
FROM mutamba_posts 
INNER JOIN 
(
    SELECT aluno_id 
    FROM mutamba_amigos 
    WHERE mutamba_amigos.amizade_id IN 
    (
     SELECT amizade_id FROM mutamba_amigos WHERE aluno_id = '{$myid}' 
    ) 
    GROUP BY aluno_id 
) mutamba_amigos ON mutamba_amigos.aluno_id = mutamba_posts.aluno_id 
WHERE mutamba_posts.post_flags < 5 
    OR mutamba_posts.post_visibility = 'show_all' 
ORDER BY mutamba_posts.post_date DESC 

更新:

SELECT mutamba_posts.* 
FROM mutamba_posts 
INNER JOIN 
(
    SELECT aluno_id 
    FROM mutamba_amigos 
    WHERE mutamba_amigos.amizade_id IN 
    (
     SELECT amizade_id FROM mutamba_amigos WHERE aluno_id = '{$myid}' 
    ) 
    GROUP BY aluno_id 
) mutamba_amigos ON mutamba_amigos.aluno_id = mutamba_posts.aluno_id 
WHERE mutamba_posts.post_flags < 5 
    OR mutamba_posts.post_visibility <> 'show_all' 
Union all 
SELECT * 
FROM mutamba_posts 
WHERE mutamba_posts.post_visibility = 'show_all' 
ORDER BY post_date DESC 
+0

爲什麼你需要'AND 1 = 1'? – Barmar

+0

@Barmar - 是的,這是不需要的。稍微困惑對不起,但它不會有任何區別 –

+0

感謝您的快速響應,它不工作,它沒有任何影響。我不知道你是否理解我,我希望它做的是忽略連接,如果'post_visibility ='show_all''。 – sunrisepoet