我正在使用三个类似于:
的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
答案 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
然后回复多长时间。