具有多个案例的内部联接查询

时间:2015-01-17 01:56:42

标签: mysql sql inner-join

我正在尝试在连接查询中添加新案例,但它不会影响结果。

我有一个包含用户帖子的表,查询检查谁是该用户的朋友(通过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只能看到自己的帖子,因为他没有朋友。

1 个答案:

答案 0 :(得分: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