Вы уже используете ВНУТРЕННИЕ СОЕДИНЕНИЯ. Когда вы перечисляете таблицы, разделенные запятой, это ярлык для INNER JOIN.
Теперь наиболее очевидный ответ заключается в том, что в ваших подзапросах, использующих функции агрегирования (COUNT и SUM), отсутствуют предложения GROUP BY.
SELECT s1_users.id userid, (
SELECT count( s1_vdata.wref )
FROM s1_vdata, s1_users
WHERE s1_vdata.owner = userid
GROUP BY s1_vdata.owner
)totalvillages, (
SELECT SUM( s1_vdata.pop )
FROM s1_users, s1_vdata
WHERE s1_vdata.owner = userid
GROUP BY s1_vdata.owner
)pop
FROM s1_users
WHERE s1_users.dp >=0
ORDER BY s1_users.dp DESC
Однако использование подзапросов в списке столбцов действительно неэффективно. Подзапросы запускаются один раз для каждой строки во внешнем запросе.
Попробуйте вместо этого
SELECT
s1_users.id AS userid,
COUNT(s1_vdata.wref) AS totalvillages,
SUM(s1.vdata.pop) AS pop
FROM
s1_users, s1_vdata --I'm cheating here! There's hidden INNER JOIN in this line ;P
WHERE
s1_users.dp >= 0
AND s1_users.id = s1_vdata.owner
GROUP BY
s1_users.id
ORDER BY
s1_users.dp DESC