Суммирующее объединение отсчетов в коррелированном подзапросе - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть членская таблица, которая имеет внешний ключ для различных других таблиц. Я проверяю каждую из этих таблиц, чтобы увидеть, есть ли у участника одна или несколько записей, и если они мне возвращают значение, если нет, я возвращаю 0, все это выбирается как общее. Это в основном работает за исключением одного места. Мне нужно проверить две таблицы, и если в одной из них есть запись, запрос вернет 5,0 в противном случае. Я пытаюсь использовать СУММУ подсчетов с UNION для этого, но я не получаю ожидаемых результатов, похоже, что выбирается только первая запись в каждой из двух таблиц, и это все.

Я использую (после некоторой помощи) серию коррелированных запросов с COUNT () и IF (), чтобы получить итог. Вот как выглядит часть запроса:

SELECT 
member_id,
(SELECT IF(COUNT(member_id)>0,10,0) FROM tbl1 WHERE member_id = m.member_id)
+
(SELECT IF(SUM(tbl_count) > 0,5,0) FROM 
  (
    SELECT member_id, COUNT(tbl2.id) as tbl_count 
    FROM tbl2
    UNION ALL
    SELECT member_id, COUNT(tbl3.id) as tbl_count 
    FROM tbl3 
  ) sub WHERE sub.member_id = m.member_id
)
as total
FROM members m

Фактический запрос объединяет еще 10 или около того таблиц, опять же, единственная часть, которая не работает, это СУММА СЧЕТА с UNION. Кто-нибудь может подсказать, как мне это сделать? Любая помощь будет очень высоко ценится. Большое спасибо.

1 Ответ

2 голосов
/ 23 ноября 2011

Я думаю, что вы ищете это:

Первая попытка (FAIL)

SELECT 
member_id,
(SELECT IF(COUNT(member_id)>0,10,0) FROM tbl1 WHERE member_id = m.member_id)
+
(SELECT IF(SUM(tbl_count) > 0,5,0) FROM 
  (
    SELECT COUNT(*) as tbl_count
      FROM tbl2
     WHERE tbl2.member_id = m.member_id
   UNION ALL
    SELECT COUNT(*) as tbl_count 
      FROM tbl3 
     WHERE tbl3.member_id = m.member_id
  ) sub
)
as total
FROM members m

Вторая попытка:

SELECT 
member_id,
(SELECT IF(COUNT(member_id)>0,10,0) FROM tbl1 WHERE member_id = m.member_id)
+
(SELECT IF(SUM(tbl_count) > 0,5,0) FROM 
  (
      SELECT member_id, COUNT(*) as tbl_count
        FROM tbl2
    GROUP BY member_id
   UNION ALL
      SELECT member_id, COUNT(*) as tbl_count 
        FROM tbl3 
    GROUP BY member_id
  ) sub
  WHERE sub.member_id = m.member_id
)
as total
FROM members m

Если в запросе 10 объединений, возможно, вам следует подумать о рефакторинге ...: -)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...