我在使用SQL查询时遇到了一些麻烦。我们在wordpress数据库中拥有超过10万用户,我正在尝试根据用户所属的组提取一些数据。
我们有两个团体,注册和专业。注册只是注册到我们网站的每个用户。 Pro,是付费订阅的用户。我遇到的问题是,WP_Groups插件的工作方式是将用户添加到组,但不是从已注册的组中删除它们。这意味着在数据库中,wp_groups_user_group表中每个用户都有重复的条目。注册= 1,Pro = 2,例如:
user_id | group_id
1 | 1
1 | 2
因此,对于这个特定的查询,我基本上想要拉除所有用户除了pro组中的用户之外。所以在上面的例子中,我不想拉出ID为1的用户。但是,如果我使用WHERE user_id = 2
或WHERE user_id = 1
,将以任一方式提取用户,因为两个条目具有相同的用户ID。
当组ID的至少一个值等于2时,有没有办法可以基本上说明不引入任何用户ID?
我以前只是将所有用户拉进去,然后在循环中筛选它们,但是由于用户数量很大,它会在完成循环之前导致超时。
查询目前看起来像这样:
$query = $wpdb->get_results("SELECT wp_users.id, wp_groups_user_group.group_id
FROM wp_users
INNER JOIN wp_groups_user_group
ON wp_users.id = wp_groups_user_group.user_id
WHERE wp_groups_user_group.group_id = 1");
答案 0 :(得分:1)
npm install -g js-beautify
brew install closure-linter
内部查询将为每个组选择select a.id from
(SELECT wp_users.id, max(wp_groups_user_group.group_id) as max_grp_id
FROM wp_users
INNER JOIN wp_groups_user_group
ON wp_users.id = wp_groups_user_group.user_id
-- WHERE wp_groups_user_group.group_id = 1
group by wp_users.id) a
where a.max_grp_id = 1
个ID。因此,如果至少有一个用户具有关联的group_id = 2,则将根据外部查询条件将其省略。
答案 1 :(得分:1)
你在这附近。通常,HAVING
子句对此类过滤非常有用
SELECT
`user_id`,
MAX(`user_group_id`) AS `max_group_id`
FROM `wp_groups_user_group`
GROUP BY `user_id`
HAVING `max_group_id` = 1
这将确定wp_groups_user_group
表中每个用户的最大组编号。并且对记录集进行选择后过滤,以删除任何具有最大组ID>的人。 1(即他们不是基本用户)。我没有在这里使用连接,因为没有必要只获取用户ID的列表。如果您需要用户表中的更多信息,显然您需要加入。