为了账号安全,请及时绑定邮箱和手机立即绑定

用于检查现有记录的 sql 查询

用于检查现有记录的 sql 查询

潇湘沐 2022-09-21 17:30:54

我有以下格式的数据:

 HashMap<PageID, Set<SubscriberIDS>>

我需要检查的是MySQL表中已经不存在每个表中的数量。表具有 和 列。SubscriberIDSPageIDsPageIDSubscriberID

这就是我到目前为止所拥有的:

String NEW_SUBSCRIBER_COUNT = "SELECT ? - COUNT(*) as new_subscribers from FB_SUBSCRIPTIONS WHERE PAGEID=? AND SUBSCRIBERID IN (?)";

第一个参数是,第二个参数是第三个参数numberOFSubscriberIDsPageIdSubscriberIds

但这需要为每个页面Id打一个。我如何修改它以使用单个查询为每个提供我。number of new subscribersPageID


查看完整描述

1 回答

?
www说

TA贡献0条经验 获得超8个赞

是否有任何特定需要在一个查询中执行此操作?因为虽然可以,但实际上使用原始解决方案并调用每个页面 ID 的查询可能更具可读性。无论如何,你想要的东西不能在一行中完成,所以你需要期望在给定的点循环。


// Build dynamic query


StringBuilder whereClause = new StringBuilder();

Iterator<PageID> it = yourMap.keySet().iterator();

while(it.hasNext()){

  PageID key = it.next();

  Set<SubscriberIDS> value = yourMap.get(key);


  // You need to fill the 'IN' clause with multiple parameters, one for each subscriber id

  StringBuilder inClause = new StringBuilder();

  for(SubscriberIDS subId : value){

    if(inClause.length > 0){

      inClause.append(", ");

    }

    inClause.append("?");


    preparedStatement.setInt(paramIndex++, subId.getId());

  }


  // For each page id we append a new 'OR' to our query

  if(whereClause.lenght > 0){

    whereClause.append(" OR ");

  }

  whereClause.append("(PAGEID=? AND SUBSCRIBERID IN (").append(inClause.toString()).append("))");

}


String query = "SELECT PAGEID, COUNT(SUBSCRIBERID) AS SUBSCRIBERS FROM FB_SUBSCRIPTIONS WHERE " + whereClause.toString() + " GROUP BY PAGEID";


// Create prepared statement and set parameters


PreparedStatement preparedStatement = connection.prepareStatement(query);

int paramIndex = 0;

it = yourMap.keySet().iterator();

while(it.hasNext()){

  PageID key = it.next();

  Set<SubscriberIDS> value = yourMap.get(key);


  preparedStatement.setInt(paramIndex++, key.getId());


  for(SubscriberIDS subId : value){

    preparedStatement.setInt(paramIndex++, subId.getId());

  }

}


// Execute query, loop over result and calculate new subscriptions


ResultSet rs = preparedStatement.executeQuery();


while(rs.next()){

  int pageId = rs.getInt("PAGEID");

  int newSubscriptions = yourMap.get(pageId).size() - rs.getInt("SUBSCRIBERS");

  System.out.println(pageId + ", " + newSubscriptions);

}

在地图中给定以下数据:


PAGEID  SUBSCRIBERIDS

1   1,3,4,5,9

2   3,4,5,6,8,9

3   2,5,6

以及数据库中的以下数据:


PAGEID  SUBSCRIBERIDS

1   3,4,10,11

2   1,2,5,7

3   1,2,5,6,7,8,9

这应该给出以下输出:


1,3

2,6

3,0

我实际上还没有运行代码,所以它可能需要一些调整,但它给了你一般的想法......


查看完整回答
反对 回复 2022-09-21

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信