如何删除重复的结果并合并mySQL查询中具有类似属性的对象?

时间:2017-03-21 14:24:46

标签: javascript mysql arrays node.js select

我正在使用带有node.js的mysql库来创建此查询:

SELECT vols.id_vol, vols.id_place, vols.id_vol_type, vols.id_user_creator, vols.name, vols.desc, vols.date_creation, vols.date_begin, vols.date_end, vols.duration, ' +
            ' vols.active, vols.start_time, vols.end_time, vols.insurance, vols.deleted, users.id_user, users.login, users.verified, users.photo_url, comments.message, comments.id_user, place.id_place, place.name AS placeName, place.lat, place.long' +
            ' FROM vols INNER JOIN users ON vols.id_user_creator = users.id_user INNER JOIN place ON vols.id_place = place.id_place LEFT JOIN comments ON comments.id_vol = vols.id_vol WHERE vols.deleted = 0

返回:

  "success": true,
  "vols": [
    {
      "vol": {
        "id_vol": 1,
        "id_place": 1,
        "id_vol_type": 2,
        "id_user_creator": 1,
      },
      "users": {
        "id_user": 1,
        "login": "",
        "verified": 0,
      },
      "comments": {
        "message": "Muito fixe",
        "id_user": 3
      },
{
      "vol": {
        "id_vol": 1,
        "id_place": 1,
        "id_vol_type": 2,
        "id_user_creator": 1,
      },
      "users": {
        "id_user": 1,
        "login": "",
        "verified": 0,
      },
      "comments": {
        "message": "ola",
        "id_user": 3
      }

目前正在针对该特定卷ID存在的每个评论重复“vol”。可以停止显示重复项并将注释合并到单个阵列上吗?

1 个答案:

答案 0 :(得分:0)

这实际上是不可能的,我的意思是你可以用group_concat函数做些什么,但它会很乱。

我在类似情况下通常做的是:

  1. 查询所有相关的字数
  2. 提取您想要查看的所有userID,placeID,commentID。(在运行所有结果以提取此数据时,最好为每个结果创建一个对象,并将它们放入索引索引数组中(对象)为每个可索引参数“user,place,comment”)
  3. 制作3个单独的查询,每个查询一个(用户,地点,评论),您只需选择相关元素(使用WHERE id IN (1,5,7,8,10)过滤器)
  4. 运行每个查询的结果,并使用索引数组(对象)将它们插入到vol对象中
  5. 在javascript中会有类似的东西(抱歉不知道node.js,所以我没有精确的解决方案

    var results = db.queryResults('SELECT vols.id_vol, vols.id_place, vols.id_vol_type, vols.id_user_creator, vols.name, vols.desc, vols.date_creation, vols.date_begin, vols.date_end, vols.duration, vols.active, vols.start_time, vols.end_time, vols.insurance, vols.deleted FROM vols WHERE vols.deleted = 0');
    var lookupByUserID = {};
    var lookupByPlaceID = {};
    var lookupByVolID = {};
    var userIN = [];
    var placeIN = [];
    var volIN = [];
    for (var i = 0; i < results.length; i++)
    {
       var result = results[i];
       if (!lookupByUserID[result.id_user_creator])
           lookupByUserID[result.id_user_creator] = [];
       lookupByUserID[result.id_user_creator].push(result);
    
       if(!lookupByPlaceID[result.id_place])
          lookupByPlaceID[result.id_place] = [];
       lookupByPlaceID[result.id_place].push(result);
    
       lookupByVolID[result.id_vol] = result;
       userIN.push(result.id_user_creator);
       placeIN.push(result.id_place);
       volIN.push(result.id_vol);
       results.comments = [];
    }
    
    var userResults = db.queryResults('SELECT users.id_user, users.login, users.verified, users.photo_url FROM users WHERE id_user IN ('+userIN.join(',')+')');
    var placeResults = db.queryResults('SELECT place.id_place, place.name AS placeName, place.lat, place.long FROM place WHERE id_place IN ('+placeIN.join(',')+')');
    var commentResults = db.queryResults('SELECT comments.id_vol, comments.message, comments.id_user FROM comments WHERE id_vol IN ('+volIN.join(',')+')');
    for (var i = 0; i < userResults.length; i++)
    {
       var user = userResults[i];
        for (var j = 0; j < lookupByUserID[user.id_user].length; j++)
            lookupByUserID[user.id_user][j].created_by_user = user;
    }
    for (var i = 0; i < placeResults.length; i++)
    {
       var place = placeResults[i];
        for (var j = 0; j < lookupByPlaceID[place.id_place].length; j++)
            lookupByPlaceID[place.id_place][j].place = place;
    }
    for (var i = 0; i < commentResults.length; i++)
    {
        var comment = commentResults[i];
        lookupByVolID[comment.id_vol].comments.push(comment);
    }
    

    现在对象“结果”应该包含所有信息