2013-07-09 54 views
-1

这是来自足球系统,每个游戏,玩家和游戏的“日志”可以保存统计。从两个不同的表格中获得结果mysql

  • “bold_players” 是与球员的表:ID,姓名,年龄...
  • “bold_playlog” 是所有日志,以游戏的表:ID,CREATEDATE,日志类型,playerid ..
    “logtype = 1”是一个目标(只有一个目标 - 每个目标在桌面上都会有一个帖子/ ID“bold_playlog”,所以如果一个游戏有四个目标,那么在“bold_playlog”相同的gameid)。

我该如何获得所有球员列表,按目标排序?

这里是我的代码的权利,但我想我已经加入了两个表或类似的东西!?

$data_player = mysql_query("SELECT id, name, goals, playtogoal FROM bold_players ORDER BY name ASC "); 
while ($row_player = mysql_fetch_assoc($data_player)) { 

$seasonstart = mktime(0, 0, 0, 7, 1, date('Y')-1); 

$logplayer = $row_player['id']; 
$data_log = mysql_query("SELECT id, createdate, logtype FROM bold_playlog WHERE logplayer=$logplayer AND logtype = 1 AND createdate > $seasonstart "); 
$getresult = mysql_num_rows($data_log); 

if($getresult > 0) { 

echo 'the result'; 

}} 
+0

“按目标排序”...在第一个目标的时候,或者是目标的数量还是...? –

+0

对不起!目标的数量。 –

回答

0

一个简单LEFT JOIN应该这样做,这个订单进球最多的第1W这将是DESC部分,首先使用ASC最少的目标。

SELECT a.*, COUNT(b.playerid) goals 
FROM bold_players a 
LEFT JOIN bold_log b 
    ON b.playerid = a.id 
AND b.logtype=1 
GROUP BY a.id, a.name, a.age 
ORDER BY COUNT(b.playerid) DESC 

An SQLfiddle to test with

如果您还需要更多的逻辑类型,则必须稍微更改该查询。如果offside是logtype 2,查询将是;

SELECT a.*, 
    COALESCE(SUM(b.logtype=1), 0) goals, 
    COALESCE(SUM(b.logtype=2), 0) offsides 
FROM bold_players a 
LEFT JOIN bold_log b 
    ON b.playerid = a.id 
-- AND (b.logtype=1 OR b.logtype=2)  -- for speedup if there are many types 
GROUP BY a.id, a.name, a.age 
ORDER BY COALESCE(SUM(b.logtype=1), 0) DESC 

Another SQLfiddle

+0

谢谢,它看起来不错 - 它的工作原理。如果我还希望将“越位”计数也放在'bold_log'中,该怎么办? (是每个球员越位的次数)? –

+0

@LasseBoWamsler用新信息更新了答案。 –

+0

完美,谢谢 - 现在它工作:) –

0

也许试试这个..我猜它一定是这样的

SELECT name, goals, sum(playtogoal) as goals, createdate, logtype 
FROM bold_players as ps LEFT JOIN bold_playlog as pl ON ps.id=pl.logplayer 
WHERE pl.logtype = 1 AND pl.createdate > $saesonstart 
GROUP BY ps.id ORDER BY name ASC 

我会做一个LEFT JOIN,因为有可能是球员没有目标,他们将显示太

相关问题