Nah*_*haz 8 mysql database join sum relational-database
我一直在寻找解决方案,有很多类似的问题,但没有任何正确的答案帮助我解决问题.
首先,我的问题/问题:
SELECT查询吗?这是我的数据库的SQL转储,包含示例数据:http://pastie.org/private/vq7qkfer5mwyraudb5dh0a
这是我认为可以解决的问题:
SELECT firstname, lastname, sum(goal.goal), sum(assist.assist), sum(gw.gw), sum(win.win), count(played.idplayer) FROM player
LEFT JOIN goal USING (idplayer)
LEFT JOIN assist USING (idplayer)
LEFT JOIN gw USING (idplayer)
LEFT JOIN win USING (idplayer)
LEFT JOIN played USING (idplayer)
GROUP BY idplayer
Run Code Online (Sandbox Code Playgroud)
我想要生成的是一个表格,其中目标,辅助,gw,win和play的列是该列中每行的总和/计数,如下所示:(提供的样本数据)
+-----------+----------+------+--------+----+-----+--------+
| firstname | lastname | goal | assist | gw | win | played |
+-----------+----------+------+--------+----+-----+--------+
| Gandalf | The White| 10 | 6 | 1 | 1 | 2 |
| Frodo | Baggins | 16 | 2 | 1 | 2 | 2 |
| Bilbo | Baggins | 7 | 3 | 0 | 0 | 2 |
+-----------+----------+------+--------+----+-----+--------+
Run Code Online (Sandbox Code Playgroud)
那么,为了再次迭代上述问题,这可能是一个查询和多个连接吗?
如果您提供解决方案/查询,请解释它们!我是适当的关系数据库的新手,我从来没有在这个项目之前使用过连接.如果除非必要,否则我会感谢你避免使用别名.
我已经运行了上面的查询,没有求和和分组,我为每个列做了一组行SELECT,我怀疑它然后相乘或加在一起,但我的印象是分组和/或做sum(TABLE.COLUMN)就能解决这个问题.
另一件事是,我认为,做一个SELECT DISTINCT或任何其他DISTINCT操作将无法工作,因为这将省略一些("重复")结果.
PS.如果重要的话,我的开发机器是一个WAMP,但是发布将在ubuntu/apache/mysql/php上.
ic3*_*3rg 12
要了解为什么没有得到您期望的答案,请查看以下查询:
SELECT * FROM player LEFT JOIN goal USING (idplayer)
Run Code Online (Sandbox Code Playgroud)
如您所见,左侧的行与右侧的匹配行重复.对每个连接重复该过程.这是您的查询的原始数据:
SELECT * FROM player
LEFT JOIN goal USING (idplayer)
LEFT JOIN assist USING (idplayer)
LEFT JOIN gw USING (idplayer)
LEFT JOIN win USING (idplayer)
LEFT JOIN played USING (idplayer)
Run Code Online (Sandbox Code Playgroud)
然后将这些重复值用于SUM计算.需要在连接行之前计算SUM:
SELECT firstname, lastname, goals, assists, gws, wins, games_played
FROM player
INNER JOIN
(SELECT idplayer, SUM(goal) AS goals FROM goal GROUP BY idplayer) a
USING (idplayer)
INNER JOIN
(SELECT idplayer, SUM(assist) AS assists FROM assist GROUP BY idplayer) b
USING (idplayer)
INNER JOIN
(SELECT idplayer, SUM(gw) AS gws FROM gw GROUP BY idplayer) c
USING (idplayer)
INNER JOIN
(SELECT idplayer, SUM(win) AS wins FROM win GROUP BY idplayer) d
USING (idplayer)
INNER JOIN
(SELECT idplayer, COUNT(*) AS games_played FROM played GROUP BY idplayer) e
USING (idplayer)
Run Code Online (Sandbox Code Playgroud)