为什么要删除变量?

时间:2013-04-25 15:09:28

标签: mysql join resultset

高中生试图为我们学校创建一个版本的Facebook。现在,在我们发布它之前,我们仍然坚持加入试用数据库中的表。

加入表格帖子,用户和朋友:

users
user    name
1       Hallie  
2       Dylan
3       Sarina
4       Dominic

friends
user    friend
1       2
1       3
1       4
2       1
3       1
4       1
2       4
4       2
3       2
2       3

posts
| user | postid | post |
+------+--------+------+
|    1 |    101 |  This is TigerBook!          |
|    2 |    102 |  I am pregnant.              |
|    1 |    103 |  I like peeps                |
|    4 |    104 |  Giant Buzz Lightyears rock. |
|    3 |    105 |  Die Tucker die              |
|    1 |    106 |  Murhur de derpity derp      |
|    2 |    107 |  banana spaghetti squid      |
|    4 |    108 |  chicken                     |

我们使用了这段代码:

SELECT users.user, 
       users.name, 
       posts.postid, 
       posts.post, 
       tmp.friend 
FROM   (SELECT friend, 
               user 
        FROM   friends 
        GROUP  BY friend) AS tmp 
       JOIN users 
         ON tmp.user = users.user 
       JOIN posts 
         ON posts.user = users.user; 

它得出结果:

+------+---------+--------+-------------------------+--------+
| user | name    | postid | post                    | friend |
+------+---------+--------+-------------------------+--------+
|    1 |  Hallie |    101 |  This is TigerBook!     |      2 |
|    1 |  Hallie |    101 |  This is TigerBook!     |      3 |
|    1 |  Hallie |    101 |  This is TigerBook!     |      4 |
|    2 |  Dylan  |    102 |  I am pregnant.         |      1 |
|    1 |  Hallie |    103 |  I like peeps           |      2 |
|    1 |  Hallie |    103 |  I like peeps           |      3 |
|    1 |  Hallie |    103 |  I like peeps           |      4 |
|    1 |  Hallie |    106 |  Murhur de derpity derp |      2 |
|    1 |  Hallie |    106 |  Murhur de derpity derp |      3 |
|    1 |  Hallie |    106 |  Murhur de derpity derp |      4 |
|    2 |  Dylan  |    107 |  banana spaghetti squid |      1 |
+------+---------+--------+-------------------------+--------+

它删除了用户3和4发布的帖子104,105和108.它忽略了用户2是3和4的朋友以及它显示的1的事实。

为什么不提出用户3和4?我们应该尝试不同的代码吗?

1 个答案:

答案 0 :(得分:0)

查看子查询返回的内容:

| FRIEND | USER |
-----------------
|      1 |    2 |
|      2 |    1 |
|      3 |    1 |
|      4 |    1 |

由于GROUP BY,您会丢失与user相关联的多个friend值。

为什么使用子查询而不是简单JOIN使用friends表本身?

SELECT users.user,
   users.name,
   posts.postid,
   posts.post,
   friends.friend
FROM friends
   JOIN users
     ON friends.user = users.user
   JOIN posts
     ON posts.user = users.user;
| USER |    NAME | POSTID |                        POST | FRIEND |
------------------------------------------------------------------
|    1 |  Hallie |    101 |          This is TigerBook! |      2 |
|    1 |  Hallie |    103 |                I like peeps |      2 |
|    1 |  Hallie |    106 |      Murhur de derpity derp |      2 |
|    1 |  Hallie |    101 |          This is TigerBook! |      3 |
|    1 |  Hallie |    103 |                I like peeps |      3 |
|    1 |  Hallie |    106 |      Murhur de derpity derp |      3 |
|    1 |  Hallie |    101 |          This is TigerBook! |      4 |
|    1 |  Hallie |    103 |                I like peeps |      4 |
|    1 |  Hallie |    106 |      Murhur de derpity derp |      4 |
|    2 |   Dylan |    102 |              I am pregnant. |      1 |
|    2 |   Dylan |    107 |      banana spaghetti squid |      1 |
|    2 |   Dylan |    102 |              I am pregnant. |      3 |
|    2 |   Dylan |    107 |      banana spaghetti squid |      3 |
|    2 |   Dylan |    102 |              I am pregnant. |      4 |
|    2 |   Dylan |    107 |      banana spaghetti squid |      4 |
|    3 |  Sarina |    105 |              Die Tucker die |      1 |
|    3 |  Sarina |    105 |              Die Tucker die |      2 |
|    4 | Dominic |    104 | Giant Buzz Lightyears rock. |      1 |
|    4 | Dominic |    108 |                     chicken |      1 |
|    4 | Dominic |    104 | Giant Buzz Lightyears rock. |      2 |
|    4 | Dominic |    108 |                     chicken |      2 |

http://sqlfiddle.com/#!2/27eb3d/6

相关问题