Хотите выбрать записи из-за их статуса в таблице, используя MySQL - PullRequest
0 голосов
/ 22 мая 2009

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

мой код:

if estate_id == ''
  if current_user.is_admin?
    filter_estates = "e.id IS NOT NULL"
  elsif current_user.has_managing_agent?
    estates = current_user.business.approved_estates.collect{|e| e.id }
    filter_estates = "e.id IN (#{estates})"
  elsif current_user.estate_manager? || current_user.board_member?
    filter_estates = "e.id = #{current_user.estate_id}"
  end
else
  filter_estates = "e.id = #{estate_id}"
end   

if status == 'All status'
  filters_status = "select e.active"
elsif status == 'Inactive' 
  filters_status = "select * from estates e where e.active = false limit 1"
else
  filters_status = "select * from estates e where e.active = true limit 1" 
end
# Query the Database.
if estate_id == ''                            
@query = Estate.find_by_sql"SELECT (e.name) as estate_name, g.name as governing_body,"+
                           "(select count(*) from stands s where s.estate_id = e.id AND #{filter_estates}) as total_stands, "+
                           "(#{filters_status}) as estate_status, "+
                           "(select count(*) from services sp where sp.estate_id = e.id AND #{filter_estates}) as service_providers,"+
                           "(select count(*) from approved_vendors av where av.estate_id = e.id  AND #{filter_estates})as vendors"+
                           " FROM estates e LEFT JOIN governing_bodies g on e.governing_body_id = g.id AND #{filter_estates} " 
else
@query = Estate.find_by_sql"SELECT (e.name) as estate_name, "+
                           "(select g.name from governing_bodies g where e.governing_body_id = g.id AND #{filter_estates}) as governing_body ,"+
                           "(select count(*) from stands s where s.estate_id = e.id AND #{filter_estates}) as total_stands, "+
                           "(select e.active from estates e where e.active = true and e.id = #{estate_id}) as estate_status,"+
                           "(select count(*) from services sp where sp.estate_id = e.id AND #{filter_estates}) as service_providers,"+
                           "(select count(*) from approved_vendors av where av.estate_id = e.id  AND #{filter_estates})as vendors"+
                           " FROM estates e WHERE e.id = #{estate_id} group by e.name" 

Я использую ruby ​​на рельсах, поэтому этот код в модели.

Заранее благодарим за помощь.

1 Ответ

2 голосов
/ 22 мая 2009

Этот код крайне "плохой", чтобы быть вежливым. Я не думаю, что вы понимаете, как работает SQL, что является существенным препятствием в такой ситуации - извините, но нет необходимости приукрашивать: - (

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

Если не считать переписывания кода для вас, верните его к основам и создайте самый простой запрос, который возвращает самый простой для вас результат. Например, запрос, который возвращает все состояния, один, который возвращает все активные состояния и т. Д. Ваше LEFT JOIN выглядит нормально, но вам нужно дополнительное WHERE в этом основном запросе, чтобы выбрать активные / неактивные строки, а не делать это в подзапросах. Вам также нужно искать другие способы доступа к «стойкам» и т. Д., Поскольку вы не можете просто втиснуть их в один столбец. Лично я бы, наверное, сначала присоединился к WHERE, будучи ленивым.

Рассматривайте этот нерабочий, но псевдо-SQL как своего рода подсказку, чтобы начать работу по крайней мере:

select e.*, g.name FROM estates e, governing_bodies g WHERE g.id = e.governing_body_id AND e.active = true;

Это даст вам только активные поместья и связанное с ними имя управляющего.

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