2015-12-30 3 views
1

Как объединить эти 2 запроса? Мне сложно писать этот запрос.Два запроса в одном

1)

SELECT question_id, name, question_text FROM questions 
WHERE ST_Intersects(ST_Buffer(ST_GeomFromText('POINT(-99.254512 19.347091)', 
4326)::geography, 1000)::geometry, the_geom) 

2)

select q.question_id, COUNT(qa.question_id) as answer_count 
from questions q 
left join question_answers qa 
on qa.question_id = q.question_id 
group by q.question_id 

(Я полный нуб в SQL)

Есть ли способ сделать это:.

SELECT 
(COUNT(qa.question_id) as answer_count 
from questions q 
left join question_answers qa 
on qa.question_id = q.question_id 
group by q.question_id), 

question_id, name, question_text FROM questions 
WHERE ST_Intersects(ST_Buffer(ST_GeomFromText('POINT(-99.254512 19.347091)', 
4326)::geography, 1000)::geometry, the_geom) 

ответ

2

Просто используйте производные таблицы, соединенные question_id, как оба запроса совместно questions в качестве источника таблицы (настроить WHERE функции дизъюнкции включить t1 таблицы псевдонимы на любых полях столбцов):

SELECT t1.question_id, t1.name, t1.question_text, t2.answer_count  
FROM  
    (SELECT question_id, name, question_text 
    FROM questions 
    WHERE ST_Intersects(ST_Buffer(ST_GeomFromText('POINT(-99.254512 19.347091)', 
      4326)::geography, 1000)::geometry, the_geom)) AS t1  
INNER JOIN  
    (SELECT q.question_id, COUNT(qa.question_id) as answer_count 
    FROM questions q 
    LEFT JOIN question_answers qa 
    ON qa.question_id = q.question_id 
    GROUP BY q.question_id) AS t2  
ON t1.question_id = t2.question_id 

В качестве альтернативы, вы можете пойти ваш предложил маршрут с совокупным подзапросом, соответствующим внутренние и внешние запросы снова question_id (как указано выше, регулировать функцию WHERE положение, чтобы включать в себя таблицу main псевдоним на любом из полей столбцов):

SELECT main.question_id, main.name, main.question_text, 
     (SELECT COUNT(qa.question_id) 
     FROM questions q 
     LEFT JOIN question_answers qa 
     ON qa.question_id = q.question_id 
     WHERE q.question_id = main.question_id 
     GROUP BY q.question_id) as answer_count 
FROM questions AS main 
WHERE ST_Intersects(ST_Buffer(ST_GeomFromText('POINT(-99.254512 19.347091)', 
     4326)::geography, 1000)::geometry, the_geom) 
+0

спасибо =) он работал. Я использовал второй. работал просто отлично ==) –

2

Это может быть упрощено:

select q.question_id, COUNT(qa.question_id) as answer_count 
from questions q 
left join question_answers qa 
on qa.question_id = q.question_id 
group by q.question_id 

к:

select qa.question_id, COUNT(qa.question_id) as answer_count 
from question_answers qa 
group by qa.question_id 

И тогда он может быть добавлен в другой запрос таким образом

SELECT q.question_id, q.name, q.question_text, COALESCE(qac.answer_count,0) as answer_count 
FROM questions q 
LEFT JOIN (
      select qa.question_id, COUNT(qa.question_id) as answer_count 
      from question_answers qa 
      group by qa.question_id 
     ) qac on q.question_id = qac.question_id 
WHERE ST_Intersects(ST_Buffer(ST_GeomFromText('POINT(-99.254512 19.347091)', 
4326)::geography, 1000)::geometry, the_geom) 
+0

Это тоже работает –

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