为什么mysql_fetch的和值增加了一倍?

Swe*_*ong 2 mysql fetch

我有一个2数据库.

1是game_jnship_user,2是game_jnship_equip和以下数据:

这是 game_jnship_user

+-----+-----------------+
| ID  | uid             |
+-----+-----------------+
| 1   | 50              |
+-----------------------+
Run Code Online (Sandbox Code Playgroud)

这是 game_jnship_equip

+-----+------------+---------------+--------------+
| ID  | uid        | ebonus        | etype        |
+-----+------------+---------------+--------------+
| 1   | 50         | 100           | 1            |
| 2   | 50         | 10            | 1            |
| 3   | 50         | 120           | 2            |
+-------------------------------------------------+
Run Code Online (Sandbox Code Playgroud)

我查询如下:

$_G['uid'] = '50';
$ushuxing = DB::query("SELECT sum(t2.ebonus) AS equipatk, sum(t3.ebonus) AS equipdef FROM ".DB::table('game_jnship_user')." t1 LEFT JOIN ".DB::table('game_jnship_equip')." t2 ON (t1.uid = t2.uid AND t2.etype = '1') LEFT JOIN ".DB::table('game_jnship_equip')." t3 ON (t1.uid = t3.uid AND t3.etype = '2') WHERE t1.uid = $_G[uid]");
$rushuxing = DB::fetch($ushuxing);
Run Code Online (Sandbox Code Playgroud)

之后,我的输出数据如下:

$rushuxing[equipatk] = 110;
$rushuxing[equipdef] = 240;
Run Code Online (Sandbox Code Playgroud)

为什么$rushuxing[equipdef]输出240不是120

谢谢.

以下是上述示例中的原始MySQL查询:

SELECT sum(t2.ebonus) AS equipatk, sum(t3.ebonus) AS equipdef
FROM game_jnship_user t1
LEFT JOIN game_jnship_equip t2
    ON (t1.uid = t2.uid AND t2.etype = '1')
LEFT JOIN game_jnship_equip t3
    ON (t1.uid = t3.uid AND t3.etype = '2')
WHERE t1.uid = '50'
Run Code Online (Sandbox Code Playgroud)

Gio*_*sos 8

该记录具有etype = 2与具有2条记录相匹配etype = 1LEFT JOIN操作,让您得到240,而不是120.

您可以使用以下使用条件聚合的查询:

SELECT SUM(CASE WHEN etype = 1 THEN ebonus ELSE 0 END) AS equipatk,
       SUM(CASE WHEN etype = 2 THEN ebonus ELSE 0 END) AS equipdef
FROM game_jnship_equip
WHERE uid = 50
Run Code Online (Sandbox Code Playgroud)

GROUP BY uid因为您正在为特定 uid值执行聚合,所以不需要子句.