sql查询以检查现有记录

时间:2019-04-04 10:58:07

标签: java mysql

我的数据格式如下:

 HashMap<PageID, Set<SubscriberIDS>> 

我需要检查的是,每个SubscriberIDS中有多少PageIDs在MySQL表中已经不存在。 MySQL表具有PageIDSubscriberID列。

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

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

第一个参数为numberOFSubscriberIDs,第二个参数为PageId,第三个参数为SubscriberIds

,但这需要为每个pageId命中。如何修改它以使用单个查询为每个number of new subscribers给我PageID

1 个答案:

答案 0 :(得分:1)

在一个查询中是否有特定的需要?因为虽然可以,但实际上使用原始解决方案并为每个页面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

我实际上还没有运行代码,因此可能需要进行一些调整,但是它为您提供了总体思路...