2009-05-14 2 views
0

Привет парня я выбор моей активной записи из моих стола поместий и всех других моих записей прекрасны, но активная запись дает мне ошибки моего кодПочему MySql дает ошибку «Подзапрос возвращает более 1 строки»?

@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, "+ "(select e.active from estates e where e.active = true AND #{filter_estates}) 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} "

и я получаю сообщение об ошибке.

(Mysql::Error: Subquery returns more than 1 row: SELECT (e.name) as estate_name, g.name as governing_body,(select count() from stands s where s.estate_id = e.id AND e.id IS NOT NULL) as total_stands, (select e.active from estates e where e.active = true AND e.id IS NOT NULL) as estate_status, (select count() from services sp where sp.estate_id = e.id AND e.id IS NOT NULL) as service_providers,(select count(*) from approved_vendors av where av.estate_id = e.id AND e.id IS NOT NULL)as vendors FROM estates e LEFT JOIN governing_bodies g on e.governing_body_id = g.id AND e.id IS NOT NULL):

и я хочу отобразить все имущественные и активные объекты.

, пожалуйста, ребята, как я могу решить эту проблему. Я использую базу данных Mysql.

ответ

3

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

(select e.active from estates e where e.active = true AND #{filter_estates}) as estate_status

линии выше и ниже, которые используют в совокупности, так что они возвращают только одну строку, это может (вероятно) возвращение нескольких строк и он не знает, какой из них следует присваивать property_status.

Вы могли бы просто изменить эту линию:

e.active as estate_status

+0

я отвлекся во время написания моего ответа. ;) +1 – NotMe

+0

Спасибо, это «(выберите e.active) как property_status». хорошего дня. –

1

Я, конечно, я не знаком с таблицей, так лучший ответ я могу дать вам прямо сейчас, почему этот запрос не работает.

выберите e.active из поместий е где e.active = истина и # {filter_estates}) как estate_status

, что линия возвращает более одной строки, которые вы не можете сделать там. Обратите внимание, что другие используют функции aggegrate, поэтому они возвращают только одну строку.

О, я не использую My SQL много, но в T-SQL, мы часто делаем вещи, как максимум (e.active) или, возможно, положить сверху 1 (который я думаю, лимит 1 в моей Sql)

+0

Мне нравится ваш ответ :) –

0

Ваш подзапрос

(SELECT e.active FROM estates e WHERE ...) AS estate_status 

возвращает более одного значения.

Если вы можете использовать «TOP 1», как:

SELECT e.name AS estate_name , 
     g.name AS governing_body, 
     (SELECT COUNT(*) FROM stands s   WHERE ...) AS total_stands, 
     (SELECT TOP 1 e.active FROM estates e  WHERE ...) AS estate_status, 
     (SELECT COUNT(*) FROM services sp   WHERE ...) AS service_providers, 
     (SELECT COUNT(*) FROM approved_vendors av WHERE ...) AS vendors 
FROM estates e 
LEFT 
JOIN governing_bodies g ON e.governing_body_id = g.id 
          AND ... 
0

подзапроса в ЗЕЬЕСТЕ должен возвращать только 1 строку и 1 столбец будет однозначными. Эта часть производит более 1 ряд:

"(select e.active from estates e where e.active = true AND #{filter_estates}) as estate_status 

изменить его на

"(select first(e.active) from estates e where e.active = true AND #{filter_estates}) as estate_status