SQL,如果至少有一行包含值,请不要拉取user_id

时间:2015-07-27 18:13:18

标签: mysql sql wordpress wordpress-plugin

我在使用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 = 2WHERE 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");

2 个答案:

答案 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的列表。如果您需要用户表中的更多信息,显然您需要加入。