使用复合PRIMARY KEY

时间:2016-01-25 21:49:08

标签: mysql sql

我有以下表格:

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子句。

2 个答案:

答案 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'

还有其他查询方法会返回相同的结果。