2015-12-17 4 views
0

Пользователь может создать приглашение.django, счет и сумма запроса

Другие пользователи могут принять приглашение.

Я хотел бы, чтобы посчитать сумму принятых пользователей для каждого приглашаемого (user_invite)

 
Invitation 

id, user_invite 
----------------- 
1, a  
2, a  
3, a  
4, b  
5, b  

InvitationAccept 

invitation, user_accept 
----------------- 
1,    c 
1,    d 
2,    e 
4,    f 

Я хотел бы получить

 
user_invite, accept_count 
---------------------------- 
a      3 (c,d,e) 
b      1 (f) 

Django ORM выглядит как

class Invitation: 
    user_invite = models.ForeigneKey(settings.AUTH_USER_MODEL) 
    invite_at = models.DateTimeField() 
    accepts = generic.GenericRelation(InvitationAccept) 

class InvitationAccept: 

    content_type = models.ForeignKey(ContentType) 
    object_id = models.PositiveIntegerField() 
    invitation = generic.GenericForeignKey('content_type', 'object_id') 

    user_accept = models.ForeignKey(settings.AUTH_USER_MODEL) 

Что это за орм? и sql эквивалент?

ответ

0

Если вы используете MySQL вы можете использовать GROUP_CONCAT и LEFT OUTER JOIN вернуть 0() за невыполнение согласованного приглашения:

SELECT i.user_invite, 
    CONCAT(COUNT(ia.invitation), ' (', 
      GROUP_CONCAT(user_accept ORDER BY user_accept),')') AS accept_count 
FROM Invitation i 
LEFT JOIN InvitationAccept ia 
    ON i.id = ia.invitation 
GROUP BY i.user_invite; 

SqlFiddleDemo

Выход:

╔══════════════╦══════════════╗ 
║ user_invite ║ accept_count ║ 
╠══════════════╬══════════════╣ 
║ a   ║ 3 (c,d,e) ║ 
║ b   ║ 1 (f)  ║ 
╚══════════════╩══════════════╝ 

EDIT:

на самом деле мне нужно только счета, (в, г, е) только для объяснения.

Теперь код переносимый и совместимый с ANSI. Он будет работать с большинством RBDMS.

SELECT i.user_invite, COUNT(ia.invitation) AS accept_count 
FROM Invitation i 
LEFT JOIN InvitationAccept ia 
    ON i.id = ia.invitation 
GROUP BY i.user_invite; 
+0

Ох спасибо, на самом деле мне нужно только счет, (c, d, e) было только для объяснения. – eugene

+0

@eugene Обновлено :) – lad2025

0

Я не знаю, какую базу данных вы используете, так что я попробовал это в MS SQL-SERVER

select a.user_invite,cast(COUNT(1) as varchar) + '(' + ' ' + 
    (STUFF((select ',' + user_accept from (select * from Invitation inv inner join InvitationAccept apct on inv.id = apct.invitation) b 
    where b.user_invite=a.user_invite FOR XML PATH('')),1,1,'')) + ' ' + ')' as accept_count 
    from (select * from Invitation inv inner join InvitationAccept apct on inv.id = apct.invitation) a 
    group by a.user_invite 

если вы используете Oracle просто попробуйте использовать другие функции, может быть, CONCAT_WS(), чтобы заменить вещи часть и || для замены +.

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