Я пишу сценарий, который получает количество строк для нескольких таблиц, однако для некоторых таблиц я хочу получить только количество строк, в которых установлен флаг (в данном случае active = 1). Есть ли способ сделать это в одном запросе?
Например:
Таблица users
имеет столбец с именем active
В таблице clients
нет столбца с именем active
Я хочу получить количество пользователей, где active = 1, и просто получить количество клиентов.
Прежде чем сказать «просто жестко запрограммировать его», это запрос, который выполняется внутри скрипта Python, который может быть запущен в многочисленных различных базах данных, и у меня нет никакого способа узнать, какие таблицы будет выбирать мой скрипт, и если у них есть столбец с именем active
, и Я предпочел бы иметь только один запрос, чтобы сделать все это вместо двух отдельных и полагаться на mysql, чтобы выдать ошибку, поэтому я знаю, чтобы использовать другой.
Ответы:
Моей первой мыслью было бы использовать
INFORMATION_SCHEMA
первое, чтобы вы узнали (в одном запросе для всех таблиц в экземпляре MySQL), какие таблицы имеютactive
столбец, а затем использовали эту информацию для построения ваших запросов. И это, наверное, самый вменяемый подход.Есть еще один хитрый способ, который работает независимо от того, есть ли в таблице такой столбец или нет:
Проверено на SQL-Fiddle Как это работает?
Если в таблице есть столбец с именем
active
, запрос «переводится», как если бы он имел:Если в таблице нет названного столбца
active
, запрос «переводится», как если бы он имел:источник
Количество клиентов на UserID с общим итогом, используя только
users
таблицу:Если таблица клиентов удалила записи, сделайте это:
Для
users
таблиц, у которых нетactive
столбца:или
Вам нужно будет выполнить эти запросы для каждой базы данных и
UNION ALL
результатов.Если вы хотите использовать базу данных INFORMATION_SCHEMA, то вот дикая догадка:
Попробуйте!
источник
Я хотел бы дополнить ответ @ ypercubeᵀᴹ, но не могу писать комментарии из-за ограничений.
Если вы не знаете, какое имя столбца используется, и вам нужно получить его максимальное значение, вы можете сделать это:
источник