SQL - если запись в таблице существует, то - PullRequest
1 голос
/ 24 июля 2011

То, что я хочу сделать, это если в "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 присутствовало только в том случае, если это запись player_shop для указанного идентификатора учетной записи.

Любая помощь?

Ответы [ 4 ]

2 голосов
/ 24 июля 2011

Вам лучше использовать 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. Это зависит от того, какую базу данных вы используете.

0 голосов
/ 24 июля 2011

Вам следует ВСЕГДА избегать использования декартового произведения в запросе SQL, когда это возможно.Вместо того, чтобы объединять таблицы accounts и player_shops в таком виде (с запятой), вам, вероятно, следует обратить внимание на LEFT OUTER JOIN, который может косвенно решить и эту проблему для вас.

0 голосов
/ 24 июля 2011

Во-первых, SELECT ing *, когда вы выбираете из более чем одной таблицы или когда у вас есть предложение group by, не имеет смысла и выдаст только ошибку.

Я думаю, что вы хотите здесь левое соединение:

 FROM accounts AS acc
 LEFT OUTER JOIN player_shops AS shop
   ON shop.acc_id = acc.acc_id

shop.acc_id будет заполнен значением NULL, если записи нет.

0 голосов
/ 24 июля 2011

Если вы используете MS SQL, попробуйте это:

WHERE acc.acc_id = COALESCE(shop.acc_id, acc.acc_id)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...