2016-07-26 6 views
-1

У меня есть три таблицы: Ad (Id, AgentId, AdDesc, AdTitle, EmailId, ADate), AdComment (ComId, электронная почта, комментарий, AdId) и MyLikes (LikeId, email, AdId). Здесь мне нужно объединить три таблицы и отобразить все поля таблицы объявлений вместе с количеством комментариев из таблицы AdComment на основе каждого объявления (Ad.Id = AdComment.AdId) и количества понравившихся из MyLikes на основе данного письма для каждого объявления. (Ad.Id = MyLikes.AdId).Соедините три таблицы с группой, чтобы получить подсчет

Когда я присоединился объявление и комментарий Ad Я -

SELECT * , (
SELECT COUNT(c.AdId) 
) AS ComCount 
FROM Ad a 
LEFT JOIN AdComment c ON a.Id = c.AdId 
GROUP BY a.Id 
ORDER BY a.Id DESC 

Это работает отлично.

Кроме того, когда я присоединился к Ad и MyLikes я -

SELECT a.Id, (
SELECT COUNT(*) 
FROM MyLikes m 
WHERE (
m.email = '[email protected]' 
AND m.AdId = a.Id 
) 
) AS MyCount 
FROM Ad a 
LEFT JOIN MyLikes m ON a.Id = m.AdId 
GROUP BY a.Id 

Это работает отлично.

Но когда я попытался соединить все три таблицы, он не работает, дает неправильное значение для комментария. Для этого я используется-

SELECT a.Id,a.AgentId,a.EmailId,a.AdTitle,a.AdDesc, (
SELECT COUNT(m.AdId) 
FROM MyLikes m 
WHERE (
m.email = '[email protected]' 
AND m.AdId = a.Id 
) 
) AS MyCount,(
SELECT COUNT(c.AdId) 
) AS ComCount 
FROM Ad a 
LEFT JOIN MyLikes m ON a.Id = m.AdId LEFT JOIN AdComment c ON a.Id = c.AdId 
GROUP BY a.Id ORDER BY a.Id DESC  

Как я могу соединить эти три таблицы и получить желаемый результат.

+2

Пожалуйста, отредактируйте ваш вопрос и предоставите данные образца и желаемые результаты. –

ответ

0

Предполагая, что я понять ваш вопрос правильно, вот один вариант с использованием подзапросов в count ваши данные в joins вместо:

select a.Id, a.AgentId, a.EmailId, a.AdTitle, a.AdDesc, 
     b.AdIdCount, c.AdIdCount 
from Ad a 
     left join (select AdId, count(*) AdIdCount 
        from AdComment 
        group by AdId) b ON a.Id = b.AdId 
     left join (select AdId, count(*) AdIdCount 
        from MyLikes 
        where email = '[email protected]' 
        group by AdId) c ON a.Id = c.AdId 

Если вы предпочитаете correlated subqueries, то это должно работать:

select a.Id, a.AgentId, a.EmailId, a.AdTitle, a.AdDesc, 
     (select count(*) 
     from AdComment b 
     where a.Id = b.AdId), 
     (select count(*) 
     from MyLikes c 
     where c.email = '[email protected]' and 
      a.Id = c.AdId) 
from Ad a 
0

Предполагая, что LikeID и ComId являются уникальными полями идентификаторов таблиц MyLikes и AdComment, вы должны иметь возможность просто используйте пару соединений и подсчитайте отдельные поля идентификаторов из каждой таблицы: -

SELECT a.Id, 
     a.AgentId, 
     a.EmailId, 
     a.AdTitle, 
     a.AdDesc, 
     COUNT(DISTINCT m.LikeId) AS MyCount, 
     COUNT(DISTINCT c.ComId) AS ComCount 
FROM Ad a 
LEFT OUTER JOIN MyLikes m ON m.email = '[email protected]' AND a.Id = m.AdId 
LEFT JOIN AdComment c ON a.Id = c.AdId 
Смежные вопросы