2013-09-11 3 views
0

В настоящее время я работаю с использованием подзапроса, но по мере того как БД растет, это станет НИЗКОЙ неэффективной. Мне интересно, есть ли более эффективный способ сделать то, что мне нужно, чтобы обойтись без подзапросов?MySQL - многострочная сумма без подзапроса

мне нужно иметь мой последний выход выглядеть следующим образом:

Question, Answer, Responses, Charts included in Response Count 
Did this work?, N/A, 26, 30 
Did this work?, Yes, 4, 30 

Это мой текущий запрос:

SELECT 
    bq_text, 
    ba_a, 
    bq_id, 
    COUNT(ba_a) AS ba_aC, 
    (SELECT COUNT(*) FROM board_done_sheet WHERE sd_b_id = bs.bs_id AND sd_sub = 1) AS sd_chartnumC 
FROM board_done_sheet AS sh 
    LEFT JOIN board_done bd 
    ON (bd.bd_id = sh.sd_bd_id) 
    LEFT JOIN boardsubs bs 
    ON (bd.bd_b_id = bs.bs_id) 
    LEFT JOIN b_q_answers ba 
    ON (sh.sd_s_id = ba.ba_s_id) 
    LEFT JOIN bsquestions bq 
    ON (bq.bq_id = ba.ba_q_id) 
    LEFT JOIN multiples m 
    ON (ba.ba_m_id = m.m_id) 
    LEFT JOIN users u 
    ON (u.us_id = bd.bd_d_id) 
    LEFT JOIN profiles p 
    ON (p.p_u_id = bd.bd_d_id) 
    LEFT JOIN users rev 
    ON (rev.us_id = bd.bd_rev) 
WHERE sd_sub = '1' AND bq_text <> 'Date' AND bq_id = 380 
GROUP BY bs_id, bq_text, ba_a 

Это прекрасно работает, проблема в том, что приходится использовать вложенные запросы, которые по прошествии времени станет менее эффективным.

Мне просто интересно, есть ли более эффективный способ сделать это суммированное поле без него.

ответ

1

Предположительно, ваш подзапрос, о котором вы беспокоитесь, является тем, который находится в вашем верхнем углу SELECT.

Это легко реорганизовать, чтобы оно не повторялось.

Просто присоедините его к остальной части стола. Вы хотите такого рода вещи:

SELECT 
bq_text, ... 
COUNT(ba_a) AS ba_aC, 
countup.countup AS sd_chartnumC 
FROM board_done_sheet AS sh 
LEFT JOIN board_done bd 
      ON (bd.bd_id = sh.sd_bd_id) 
... 
LEFT JOIN users rev 
      ON (rev.us_id = bd.bd_rev) 
JOIN (
      SELECT COUNT(*) AS countup , sd_b_id 
      FROM board_done_sheet 
      WHERE sd_sub = 1 
     GROUP BY sd_b_id 
    ) AS countup ON countup.sd_b_id = bs.bs_id 
WHERE sd_sub = '1' 
    AND bq_text <> 'Date' 
    AND bq_id = 380 
GROUP BY bs_id, bq_text, ba_a 

countup подзапрос формирует сводную таблицу подсчета и идентификаторов, а затем к нему присоединяется к другим таблицам.

ВСПОМОГАТЕЛЬНЫЙ каскад этой сложности может стать неэффективным по другим причинам, так как ваша таблица растет, если вы неправильно структурируете свои индексы.

+0

Спасибо, я попробую сейчас. К счастью, у меня есть индексы на всех столбцах, которые использовались для соединения, и т. Д. Поэтому это должно поддерживать его относительно живым :) – jfreak53

+0

Я получаю эту ошибку: 'Неизвестный столбец 'bs.bs_id' in 'where clause'' – jfreak53

+0

Я неправильно понял цель положения SELECT COUNT (*); см. переработанный подзапрос. Конечно, у меня нет ваших данных, поэтому я не могу отлаживать эти запросы. –

Смежные вопросы