[thelist] mysql join and subqueries
partyarmy
partyarmy at gmail.com
Sat Jun 4 16:41:54 CDT 2005
thanks matt and phil
tried this one below, but get a unknown table name 'members' error.
i had to make some changes, and put the table names in front of a few
column names. theres three different tables all together, logins,
members, and profile.
SELECT logins.member_id, count(*) AS logincount
FROM logins INNER JOIN profile
ON logins.member_id = profile.member_id
WHERE members.city = 'vancouver' AND profile.category_id = '0' AND
profile.profile_data LIKE '%three%'
GROUP BY logins.member_id
ORDER BY logincount DESC
LIMIT 0, 20
On 6/3/05, Phil Turmel <philip at turmel.org> wrote:
> partyarmy wrote:
> > having trouble with a complicated (for me) sql statement.
> >
> > SELECT members.member_id
> > FROM members
> > LEFT JOIN profile
> > ON members.member_id=profile.member_id
> > WHERE members.city = 'vancouver' AND profile.category_id = '0' AND
> > profile.profile_data LIKE '%three%'
> > LIMIT 0, 20
> >
> > so far this works great, but, i need to take the result set, which
> > will be a bunch of member_id's and do this query.
> >
> > SELECT COUNT(member_id) FROM logins WHERE member_id = ???????;
> >
> > where the ??????? are the member_id's from the JOIN above. then, order
> > by the total number of logins.
> >
> > not sure if this can be done without using subqueries for my server is
> > still reluctant to upgrade.
> >
> > any help will be greatly appreciated. thanks guys.
> >
> > codi lechasseur
> Hi codi,
>
> Simplification opportunity first:
>
> Your first query might not need a JOIN at all... Are all `member_id`s in
> profile also in members (or supposed to be)? If so, your first query
> simplifies to:
>
> SELECT member_id
> FROM profile
> WHERE city = 'vancouver' AND category_id = '0' AND
> profile_data LIKE '%three%'
> LIMIT 0, 20
>
> If `member_id`s could be in profile but not members, and you really want
> to exclude them, at least change the LEFT JOIN to INNER JOIN. With
> conditions on city, category, and profile_data from profiles, any
> records from members that have no matching profile data will get tossed
> anyways. Might as well do it in the JOIN, which should be much faster.
>
> Now for the count you're looking for:
>
> If you have the luxury of subquery support, I recommend this:
>
> SELECT member_id, count(*) AS logincount
> FROM logins
> WHERE member_id IN (SELECT member_id
> FROM profile
> WHERE city = 'vancouver' AND category_id = '0' AND
> profile_data LIKE '%three%'
> LIMIT 0, 20)
> GROUP BY member_id
> ORDER BY logincount DESC
>
> I'm presuming you want to know who's logging in the most, so I put the
> DESC qualifier on the ORDER clause.
>
> I'm not sure the LIMIT clause is really where you want it, though. You
> may want to allow all matching member profiles, count 'em up, sort
> descending, then cut it off at twenty results. Like so:
>
> SELECT member_id, count(*) AS logincount
> FROM logins
> WHERE member_id IN (SELECT member_id
> FROM profile
> WHERE city = 'vancouver' AND category_id = '0' AND
> profile_data LIKE '%three%')
> GROUP BY member_id
> ORDER BY logincount DESC
> LIMIT 0, 20
>
> But you might not be able to use subqueries, so convert to a JOIN instead:
>
> SELECT logins.member_id, count(*) AS logincount
> FROM logins INNER JOIN profile
> ON logins.member_id = profile.member_id
> WHERE city = 'vancouver' AND category_id = '0' AND
> profile_data LIKE '%three%'
> GROUP BY logins.member_id
> ORDER BY logincount DESC
> LIMIT 0, 20
>
>
> HTH,
>
> Phil
> --
>
> * * Please support the community that supports you. * *
> http://evolt.org/help_support_evolt/
>
> For unsubscribe and other options, including the Tip Harvester
> and archives of thelist go to: http://lists.evolt.org
> Workers of the Web, evolt !
>
More information about the thelist
mailing list