Mysql连接三个表的问题

时间:2010-11-21 19:25:21

标签: mysql join

我正在使用三个类似于:

的mysql表

会员帐户表

|       id     |     name    |   status   |
-------------------------------------------
|       1      |      mike   |      0     |
|       2      |      peter  |      1     |
|       3      |      john   |      1     |
|       4      |      any    |      1     |

朋友列表:

|    myid     |    user     |    date    |
------------------------------------------
|     10      |     2       | 2010-01-04 |
|     3       |     10      | 2010-09-05 |
|     4       |     10      | 2010-10-23 | 

用户图库表:

|    fotoid     |    userid     |    pic1    |
------------------------------------------
|      101      |       2       |    1.jpg   |
|      102      |       3       |    2.jpg   |
|      103      |       4       |    3.jpg   |

我想加入这三个表并获取查询结果,该结果将列出我添加到朋友列表的用户以及让我同时添加到列表中的用户,所有这些用户必须具有'1的状态'从会员表中显示他们的照片来自画廊表。

在此示例中,我的ID为“10”。在画廊字段的表格中,“MyID”表示已将其他用户添加到他们的朋友的用户,而“用户”是添加的用户的ID。

此示例中的最终结果应如下所示:

|    id    |   name   |   status   |    pic1   |
------------------------------------------------
|    2     |  peter   |     1      |   1.jpg   |
|    3     |  john    |     1      |   2.jpg   |
|    4     |  any     |     1      |   3.jpg   |

我该怎么做?

mysql EXPLAIN:

id  |  select_type     |  table  |    type   |   possible_keys   |  key    |   key_len   |    ref    |    rows   |    extra                            
-------------------------------------------------------------------------------------------------------------------------------------------------
1   |  primary         |   g     |   ALL     |   id              |  NULL   |   NULL      |   NULL    |   7925    |  Using where
1   |  primary         |   a     |   eg_ref  |   id              |  id     |   4         |   g.id    |   1       |  Using where
2   |DEPENDENT SUBQUERY|   a2    |   index   |   id              |  NULL   |   NULL      |   NULL    |   90734   |  Using index; Using temporary; Using filesort;
2   |DEPENDENT SUBQUERY|   f     |   index   |   rds_index       |rds_index|   8         |   NULL    |   138945  |  Using where;Using index;Using join buffer 

1 个答案:

答案 0 :(得分:2)

SELECT a.id, 
       a.name, 
       a.status, 
       g.pic1 
FROM   accounts a 
       JOIN galleries g 
         ON g.userid = a.id 
WHERE  a.id IN (SELECT a2.id 
                FROM   accounts a2 
                       JOIN friends f 
                         ON ( f.myid = a2.id 
                               OR f.user = a2.id ) 
                WHERE  ( f.myid = 10 
                          OR f.user = 10 ) 
                GROUP  BY a2.id) 
       and a.status = 1 

编辑1

现在我们来看看子查询,现在松散了这个组:

确保您在这些列上有索引:

accounts.id
friends.myid
friends.user

运行此查询:

SELECT a2.id 
FROM   accounts a2 
       JOIN friends f 
         ON f.myid = a2.id 
WHERE  f.user = 10 
UNION ALL 
SELECT a2.id 
FROM   accounts a2 
       JOIN friends f 
         ON f.user = a2.id 
WHERE  f.myid = 10 

然后回复多长时间。