Home > Mobile >  Join two tables and get count of one but all results matching ID on other
Join two tables and get count of one but all results matching ID on other

Time:10-27

This sounds a bit confusing, but it's actually easy.

In one table I store events (like parties).

Example:

USERID EventName EVENTID
10 CoolEvent 0
10 MediocreEvent 1

And another table stores invites to that party. Those can have a different status, like "accepted" or "host" (or "declined" and so on).

Example:

EVENTID status
0 accepted
0 host
0 declined

Basically, I need to get all events from one USERID, but also I want to know how many people have either accepted to that event or are the host.

So if I want to find out what events the user with the ID 10 has the result should be:

{EVENTID: 0, EventName: CoolEvent, Count(status == accepted OR host): 2}

{EVENTID: 1, EventName: MediocreEvent, Count(status == accepted OR host): 0}

So two results in total.

This has to happen in one single query.

Can you help me here?

I tried:

var sqlString = "SELECT a.name, a.venueAdresse, a.userID, a.tblEventID, a.venueCity, a.startTimeAndDateUnixTicks, a.displayStartTime, a.slots, a.eventPictureThumb, COUNT(b.status) \
FROM 10561_12865_tblEvents a \
RIGHT JOIN 10561_12865_tblInvites b ON (a.tblEventID = b.tblEventID) \
WHERE a.userID  = '"   userID   "'\
AND (b.status = 'accepted' OR b.status = 'host') \
ORDER BY createdUnixInt DESC \
LIMIT "   start   ","   count

But this will only return results where ID matches AND status is either accepted or host, but I just want to count the occurrences from one table. So basically the AND just refers to the count property.

So I am a bit stuck here.

CodePudding user response:

The simplest way is with a correlated subquery:

SELECT e.name, e.venueAdresse, e.userID, e.tblEventID, e.venueCity, e.startTimeAndDateUnixTicks, e.displayStartTime, e.slots, e.eventPictureThumb, 
       (
         SELECT COUNT(*) 
         FROM `10561_12865_tblInvites` i
         WHERE i.tblEventID = e.tblEventID AND (i.status = 'accepted' OR i.status = 'host')
       ) counter
FROM `10561_12865_tblEvents` e 
WHERE e.userID  = ? 
ORDER BY e.createdUnixInt DESC 
LIMIT ?

Replace the ? placeholders with the parameters that you pass.

  • Related