Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于检查现有记录的sql查询_Java_Mysql - Fatal编程技术网

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

Java 用于检查现有记录的sql查询,java,mysql,Java,Mysql,我有以下格式的数据: HashMap<PageID, Set<SubscriberIDS>> 第一个参数是NumberOfSubscriberId,第二个是PageId,第三个是SubscriberId 但是需要为每个pageId点击这个。如何修改它,以便使用单个查询为每个PageID提供新订阅者的数量。是否需要在一个查询中执行此操作?因为虽然可以,但实际上使用原始解决方案并为每个页面id调用查询可能更具可读性。在任何情况下,您想要的都不能在一行中完成,因此您需要期

我有以下格式的数据:

 HashMap<PageID, Set<SubscriberIDS>> 
第一个参数是NumberOfSubscriberId,第二个是PageId,第三个是SubscriberId


但是需要为每个pageId点击这个。如何修改它,以便使用单个查询为每个PageID提供新订阅者的数量。

是否需要在一个查询中执行此操作?因为虽然可以,但实际上使用原始解决方案并为每个页面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   3,4,10,11
2   1,2,5,7
3   1,2,5,6,7,8,9
这将产生以下输出:

1,3
2,6
3,0

我还没有实际运行代码,因此可能需要进行一些调整,但它给出了总体思路…

这在逻辑上是不正确的。它将为所有页面ID提供相同数量的新订阅用户。事实上,您必须使用“COUNTSUBSCRIBERID”而不是count*scenetive.nup。yourMap.getrs.getIntPAGEID.size-rs.getIntsubscribers;}这意味着“我的地图”现有订阅者的大小。这就是我现在要问的问题,不是真的,yourMap.getrs.getIntPAGEID.size不会给出地图的大小,它会给出给定pageid的订阅集的大小。因此,该页面ID的订阅者总数-该页面ID的现有订阅者=该页面ID的新订阅者。yourMap.getrs.getIntPAGEID.size-这表示进入的订阅者数量,rs.getIntsubscribers表示总数量。我们在哪里检查进入数据库的数据是否已经存在于DB中@vincent
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