我有以下表格:
Users:
+--------+------+
| UserID | Name |
+--------+------+
| 1 | Bob |
| 2 | Mike |
| 3 | Tim |
| 4 | Joe |
+--------+------+
Friends:
+---------+---------+
| UserID1 | UserID2 |
+---------+---------+
| 1 | 2 |
| 1 | 3 |
| 3 | 4 |
| 4 | 2 |
+---------+---------+
现在让我们说Bob登录我的服务。我需要运行一个查询来加载他朋友的所有UserID以及他们的名字。
Bob's friends:
+--------+------+
| UserID | Name |
+--------+------+
| 2 | Mike |
| 3 | Tim |
+--------+------+
请注意,“Friends”表具有复合主键,同时使用UserID1和UserID2。每个“友谊”只列在表格中一次。
解决这个问题的最佳方法是什么?换句话说,我应该使用什么查询来查找由UserID和Name组成的用户的朋友?显然,从多个表中选择数据时需要某种JOIN子句。
答案 0 :(得分:2)
首先,您想加入以了解Bob的朋友是谁。然后你需要加入回来,看看他朋友的名字。
$where = array("table1.id" => "table2.id");
$query = $this->db->get_where("table1, table2" , $where);
return $query->result();
答案 1 :(得分:2)
友谊仅在表格中列出一次。如果示例数据表示Mike
有三个朋友,那么我们需要以两种方式查询friends
表。我将使用两个SELECT并将结果与UNION ALL
集合运算符组合。像这样:
SELECT uf.userid
, uf.name
FROM users uf
JOIN friends ff
ON ff.userid1 = uf.userid
JOIN users sf
ON sf.userid = ff.userid2
WHERE sf.name = 'Mike'
UNION ALL
SELECT ut.userid
, ut.name
FROM users ut
JOIN friends ft
ON ft.userid2 = ut.userid
JOIN users st
ON st.userid = ft.userid1
WHERE st.name = 'Mike'
还有其他查询方法会返回相同的结果。