【问题标题】:Mysql join three tables problemmysql连接三表问题
【发布时间】:2010-11-21 19:25:20
【问题描述】:

我正在使用三个 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 解释:

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 

【问题讨论】:

标签: mysql join


【解决方案1】:
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 

然后发回执行了多长时间。

【讨论】:

  • @Pentium10 - 感谢 Pentium10。我尝试了这个查询,但它需要超过 5 分钟,并且 mysql 服务器卡住了。有什么原因吗?
  • 向我们展示您的表架构,您可能在关键列上缺少一些索引。还要在查询上运行explain extended 并发布详细信息。
  • @Pentium10 - 您可以在我的问题中查看 mysql 解释的详细信息。我只是发布这些细节。谢谢。
  • 能否请您检查单独执行的子查询是否运行缓慢。并且由于某种原因,解释扩展告诉这是一个依赖子查询,我不知道为什么会这样说,请确保您没有从子查询外部引用任何表/列,例如 accounts
  • @Pentium10 - 我测试了子查询,它很慢但仍然给出了结果。但是当我尝试整个查询时,SQL 服务器被阻止了。此查询旨在让客户深入了解他们朋友列表中的人员不断变化的个人资料。类似于 facebook 上的内容。
猜你喜欢
  • 1970-01-01
  • 2014-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多