1

空のテーブルを結合してkills_totalフィールドに追加すると、 kills_total の値がNULLと表示されます。

SELECT 
       alias.name alias, team.name team, sid.steam_id steam_id,
       (SUM(ws1.kills) + SUM(ws2.kills) + SUM(spnr.kills)) kills_total
FROM pickup
            JOIN player ON player.pickup_id = pickup.id
            JOIN team ON player.team_id = team.id
            JOIN sid ON player.sid_id = sid.id
            JOIN alias ON player.alias_id = alias.id
            LEFT JOIN weapon_stats_1 ws1 ON ws1.pickup_id = pickup.id AND ws1.player_id = player.id
            LEFT JOIN weapon_stats_2 ws2 ON ws2.pickup_id = pickup.id AND ws2.player_id = player.id
            LEFT JOIN spanner_stats spnr ON spnr.pickup_id = pickup.id AND spnr.player_id = player.id
WHERE pickup.logfile_name = 'srv-20130725-2151-log' GROUP BY player.id ORDER BY kills_total DESC

結果は次のとおりです。

不合格

SELECT 
       alias.name alias, team.name team, sid.steam_id steam_id,
       (SUM(ws1.kills) + SUM(ws2.kills)) kills_total
FROM pickup
            JOIN player ON player.pickup_id = pickup.id
            JOIN team ON player.team_id = team.id
            JOIN sid ON player.sid_id = sid.id
            JOIN alias ON player.alias_id = alias.id
            LEFT JOIN weapon_stats_1 ws1 ON ws1.pickup_id = pickup.id AND ws1.player_id = player.id
            LEFT JOIN weapon_stats_2 ws2 ON ws2.pickup_id = pickup.id AND ws2.player_id = player.id
WHERE pickup.logfile_name = 'srv-20130725-2151-log' GROUP BY player.id ORDER BY kills_total DESC

これは、クエリから空のテーブルを削除したときの結果です。

ここに画像の説明を入力

spanner_statsテーブルに結合し、空の場合は何もしない (つまり、SUM(0))方法で、 ws1ws2の値は SUM() され、結合されている 3 番目のテーブルにシングルがない場合でもkills_totalに表示されます。行一致" thirdTable.pickup_id = pickup.id AND thirdTable.player_id = player.id" ?

4

2 に答える 2

3

これを試して:

SELECT 
       alias.name alias, team.name team, sid.steam_id steam_id,
       (SUM(IFNULL(ws1.kills,0)) + SUM(IFNULL(ws2.kills,0)) + SUM(IFNULL(spnr.kills,0))) kills_total
FROM pickup
            JOIN player ON player.pickup_id = pickup.id
            JOIN team ON player.team_id = team.id
            JOIN sid ON player.sid_id = sid.id
            JOIN alias ON player.alias_id = alias.id
            LEFT JOIN weapon_stats_1 ws1 ON ws1.pickup_id = pickup.id AND ws1.player_id = player.id
            LEFT JOIN weapon_stats_2 ws2 ON ws2.pickup_id = pickup.id AND ws2.player_id = player.id
            LEFT JOIN spanner_stats spnr ON spnr.pickup_id = pickup.id AND spnr.player_id = player.id
WHERE pickup.logfile_name = 'srv-20130725-2151-log' GROUP BY player.id ORDER BY kills_total DESC

NULL 基本的に、左結合のレコードがない場合は代わりに 0 を使用するように MySql に指示しています。IFNULL() http://www.w3schools.com/sql/sql_isnull.aspをご覧ください。

いずれかのコンポーネントが NULL の場合、SQL SUM() 関数は NULL を返します。

于 2013-07-26T04:13:12.023 に答える
1

多分あなたはIFNULL()を使ってみることができます

IFNULL(expr1,expr2)

expr1 が NULL でない場合、IFNULL() は expr1 を返します。それ以外の場合は expr2 を返します。IFNULL() は、使用されるコンテキストに応じて、数値または文字列の値を返します。

違いを示すために、以下の例を見てください。

SQL フィドルのデモ

于 2013-07-26T04:12:46.473 に答える