我想要做的是,如果帐户ID的“player_shops”中有条目,则具有特定的where子句,否则没有where子句。如果这是有道理的。这是我的代码:
SELECT *,
SUM(acc.gold_coins + shop.gold_coins) AS total_gold
FROM accounts AS acc
, player_shops AS shop
WHERE acc.acc_id = shop.acc_id
GROUP BY acc.acc_id
ORDER BY total_gold DESC
LIMIT 100
我希望WHERE子句只在那里,如果它是指定帐户ID的player_shop条目。
任何帮助?
答案 0 :(得分:2)
你最好使用JOIN。
SELECT *,
SUM(acc.gold_coins + IF(shop.gold_coins IS NULL, 0, shop.gold_coins)) AS total_gold
FROM accounts AS acc
LEFT JOIN player_shops AS shop
ON acc.acc_id = shop.acc_id
GROUP BY acc.acc_id
ORDER BY total_gold DESC
LIMIT 100
我不确定IF语法。这取决于你使用的数据库。
答案 1 :(得分:0)
如果您使用的是MS SQL,请尝试以下方法:
WHERE acc.acc_id = COALESCE(shop.acc_id, acc.acc_id)
答案 2 :(得分:0)
您应该始终尽可能避免在SQL查询中使用笛卡尔积。不要像那样加入表accounts
和player_shops
(用逗号),你应该调查LEFT OUTER JOIN
,这也可能为你间接地解决这个问题。
答案 3 :(得分:0)
首先,SELECT
*
当您从多个表中进行选择时,或者当您拥有group by
子句时,它是无意义的,并且只会发出错误。
我认为你在这里想要一个LEFT JOIN:
FROM accounts AS acc
LEFT OUTER JOIN player_shops AS shop
ON shop.acc_id = acc.acc_id
如果没有记录,shop.acc_id将填充NULL。