mysql按id加入3个表

时间:2013-10-27 19:16:03

标签: mysql sql

我有3个表要加入,需要一些帮助才能使它工作,这是我的架构:

捐赠:

+--------------------+------------+   
|   uid   |  amount  |   date     |
+---------+----------+------------+
|    1    |    20    | 2013-10-10 | 
|    2    |    5     | 2013-10-03 | 
|    2    |    50    | 2013-09-25 |
|    2    |    5     | 2013-10-01 |
+---------+----------+------------+

用户:

+----+------------+
| id |  username  | 
+----+------------+
| 1  |    rob     |
| 2  |    mike    | 
+----+------------+

导致:

+--------------------+------------+
|   id    |   uid    |   cause    | <missing cid (cause id)
+---------+----------+------------+
|    1    |    1     |  stop war  | 
|    2    |    2     |   love     | 
|    3    |    2     |   hate     | 
|    4    |    2     |   love     | 
+---------+----------+------------+

我想要的结果(数据被裁剪以供阅读)

+---------+-------------+---------+-------------+
|    id   |   username  | amount  |    cause    | 
+---------+-------------+---------+-------------+
|    1    |     rob     |   20    |  stop war   |
|    2    |     mike    |   5     |    love     |
+---------+-------------+-----------------------+

等...

这是我当前的查询,但返回双数据:

SELECT i.*, t.cause as tag_name
FROM users i
INNER JOIN donations tti ON (tti.uid = i.id)
INNER JOIN causes t ON (t.uid = tti.uid)
编辑:在小提琴上修复了sql架构 http://sqlfiddle.com/#!2/0e06c/1架构和数据

我怎么能这样做?

3 个答案:

答案 0 :(得分:1)

看来你的桌子模型不对。原因和捐赠之间应该有关系。

如果不是在进行连接时,您将获得重复的行。

例如。您的模型可能如下所示:

捐赠

+--------------------+------------+
|   uid   |  amount  |   date     |  causeId
+---------+----------+------------+
|    1    |    20    | 2013-10-10 |     1
|    2    |    5     | 2013-10-03 |     2
|    2    |    50    | 2013-09-25 |     3
|    2    |    5     | 2013-10-01 |     2
+---------+----------+------------+

导致:

+----------------------+
|   id    |   cause    |
+---------+------------+
|    1    |   stop war | 
|    2    |   love     | 
|    3    |   hate     | 
+---------+------------+

然后正确的查询应该是这个

SELECT i.*, t.cause as tag_name
FROM users i
INNER JOIN donations tti ON (tti.uid = i.id)
INNER JOIN causes t ON (t.id = tti.causeId)

答案 1 :(得分:0)

试试这个

SELECT CONCAT(i.username ,' ',i.first_name) `name`, 
SUM(tti.amount), 
t.cause AS tag_name
FROM users i
LEFT JOIN donations tti ON (tti.uid = i.id)
INNER JOIN causes t ON (t.uid = tti.uid)
GROUP BY i.id

Fiddle

答案 2 :(得分:0)

您需要同时匹配来自用户和原因表的ID,如下所示:

SELECT i.*, t.cause as tag_name
FROM users i
INNER JOIN donations tti ON (tti.uid = i.id)
INNER JOIN causes t ON (t.uid = tti.uid and t.id = i.id)

格式化的道歉,我正在手机上打字。