2016-07-08 2 views
2

Я ищу эффективную альтернативу подзапросам/объединениям для этого запроса. Скажем, я таблица, которая хранит информацию о компаниях со следующими столбцами:MySQL альтернатива подзапросам/присоединению

  • имя: название компании
  • состояние: состояние компании находится в
  • дохода: годовой доход компания
  • сотрудников: сколько сотрудников этой компании есть
  • active_business: Wether или нет компании в бизнесе (1 = да, 0 = нет)

Предположим, что из этой таблицы я хочу узнать, сколько компаний в каждом штате удовлетворяют требованиям относительно минимальной суммы дохода, а также того, сколько компаний удовлетворяют требованиям для минимального количества сотрудников. Это может быть выражено в виде следующего подзапроса (также может быть записана в виде объединения):

SELECT state, 
     (
      SELECT count(*) 
      FROM records AS a 
      WHERE a.state = records.state 
       AND a.revenue > 1000000 
     ) AS companies_with_min_revenue, 
     (
      SELECT count(*) 
      FROM records AS a 
      WHERE a.state = records.state 
       AND a.employees > 10 
     ) AS companies_with_min_employees 
FROM records 
WHERE active_business = 1 
GROUP BY state 

Мой вопрос заключается в следующем. Могу ли я сделать это без подзапросов или соединений? Так как запрос уже выполняет итерацию по каждой строке (нет индексов), есть ли способ добавить условие, что если строка удовлетворяет минимальным требованиям к доходам и находится в одном состоянии, она будет увеличивать некоторый счетчик для запроса (похоже на карту/сокращение)?

+3

Нет индексов? Ну, тогда твоя проблема. Решаемые. – Strawberry

+0

Как правило, эта ситуация была бы проиндексирована. Однако это не работает на mysql. Я использую хранилище данных JSON в Memsql с динамическими полями, представленными пользователями, поэтому индексы по определенным значениям не были правильным путем. Кроме того, он работает очень быстро, поскольку memsql находится в памяти, поэтому индексы не нужны. Я задал такой вопрос, поскольку он был логически эквивалентен этой проблеме более простым способом. – user396404

ответ

3

Я думаю CASE и SUM будет решить:

SELECT state 
    , SUM(CASE WHEN R.revenue > 1000000 THEN 1 ELSE 0 END) AS companies_with_min_revenue 
    , SUM(CASE WHEN R.employees > 10 THEN 1 ELSE 0 END) AS companies_with_min_employees 
    FROM records R 
    WHERE R.active_business = 1 
    GROUP BY R.state 

Как вы можете видеть, мы будем иметь значение 1 на запись с доходом больше, чем 1000000 (еще 0), то мы будем возьмите сумму. То же самое происходит с другим столбцом.

StackOverflow вопрос. Вы найдете это при поиске «sql условный счет» в google.

+0

Именно то, что я искал. Благодаря! – user396404

+0

Нет проблем @ user396404 – KaeL

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