Also be aware that, at least on MySQL, subqueries in a WHERE clause get executed for every otherwise-matching record. Depending on your dataset that could eat up a lot of time. Subqueries in a SELECT or FROM clause are only executed once, so those are fine.

With a proper join against a weighting table, though, the subquery shouldn't even be necessary.

--Larry Garfield

Ken Winters wrote:
select * from users where uid in (select uid from users_roles where rid in (4,5,6,7,8));

Note that I dropped the rid column from the results, but your query didn't provide all that useful results for it to start with (picked one). If you actually need it then you may still need a join, and also might need something like group_concat.

- Ken Winters

On Nov 23, 2009, at 10:41 AM, Brian Vuyk wrote:

1.) We are including extra data from the users table (wasn't central to the question, so I omitted it to simplify)
2.) How would you structure this exactly with subquery?

Brian

Ken Winters wrote:
On Nov 23, 2009, at 10:18 AM, Brian Vuyk wrote:

SELECT DISTINCT u.uid, ur.rid FROM {users} u RIGHT JOIN {users_roles} ur ON ur.uid = u.uid WHERE rid = 6 OR rid = 8 OR rid = 5 OR rid = 7 OR rid = 4 GROUP BY uid;

Brian

1) Why are you doing a join when all the info you are selecting is in the users_roles table? If you don't need it for some other reason, problem solved. 2) I've found it's generally better to use subqueries (where X in (select Y from Z)) rather than join and group.

- Ken Winters


Reply via email to