Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.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
Javascript 无法通过MYSQL查询获得我想要的结果_Javascript_Mysql_Node.js - Fatal编程技术网

Javascript 无法通过MYSQL查询获得我想要的结果

Javascript 无法通过MYSQL查询获得我想要的结果,javascript,mysql,node.js,Javascript,Mysql,Node.js,我有一个名为subcategories的表,其中列“id”和“name”,还有一个名为goals的表,其中列“id”、“name”和外键“subcategory\u id” 我想要一个查询,该查询生成一个子类别对象数组,该数组具有一个属性“goals”,该属性是一个目标对象数组。 也请举例说明JS代码中的结果: result = [ {id: 1, name: "name", goals: [{id: 1, name: "goalName"}, {...}, {...}]

我有一个名为subcategories的表,其中列“id”和“name”,还有一个名为goals的表,其中列“id”、“name”和外键“subcategory\u id”

我想要一个查询,该查询生成一个子类别对象数组,该数组具有一个属性“goals”,该属性是一个目标对象数组。 也请举例说明JS代码中的结果:

result = [
           {id: 1, name: "name", goals: [{id: 1, name: "goalName"}, {...},  {...}]}, 
           {...}, 
           {...}
         ]
但是如果使用不同的语法,其他语言的结果将是相同的

Thusfar我试着用left join这样做:

SELECT sc.ID as subcatId, sc.name as subcatName, g.ID as ID, g.name as name 
FROM needs_subcategories as sc 
LEFT JOIN needs_goals as g 
ON sc.ID=g.subcategory_id
function processResults(collection, groupKey) {
    var result = _.chain(collection)
                  .groupBy(groupKey)
                  .toPairs()
                  .map(function (currentItem) {
                      // 'text' and 'children' are the keys I want in my resulting object
                      // children being the property that contains the array of goal objects
                      return _.zipObject(['text', 'children'], currentItem);
                  })
                  .value();
    return result;
}
但这些目标并没有被归为一个子类别。。我觉得应该可以进行查询,但我不知道/google怎么做,因为我不知道如何表达这个问题,因为我缺乏SQL知识

希望你们能帮助我


提前谢谢。

您无法通过查询实现这一点。MySQL不能这样做

您当前正在获取所有目标,每个目标及其子类别都将重复

您可以使用php中的一些代码示例将其转换为所需的数组,您可以将其转换为任何其他语言

$result=array();
$lastSubcatId=null;
$goals=array();
while($row=$query->fetch_object()) { //assuming $query is the resultset
    if($lastSubcatId&&$lastSubcatId!=$row->subcatId) {
        $row->goals=$goals;
        $result[]=$row; //or you could assign each desired property
        $goals=array();
    }
    $goals[]=$row; //or you could assign each desired property
}
//surely, there are items left in $goals
if($lastSubcatId) {
    $row->goals=$goals;
    $result[]=$row; //or you could assign each desired property
}
但我认为,更有效的方法是使用多个查询:

$result=array();
$subcats=$db->query("SELECT * FROM needs_subcategories");
while($subcat=$subcats->fetch_object()) {
    //you might want to use prepared statements, I'm just simplifying
    //it will not only be safer, but reusing the prepared statement will increase the performance considerably
    $goals=$db->query("select * from needs_goals where subcategory_id=".$subcat->ID); 
    $temp=array();
    while($goal=$goals->fetch_object()) $temp[]=$goal;
    $subcat->goals=$temp;
    $result[]=$subcat;
}

最后,我按照@tadman在评论中的建议解决了这个问题

我根据答案中的信息创建了一个函数,如下所示:

SELECT sc.ID as subcatId, sc.name as subcatName, g.ID as ID, g.name as name 
FROM needs_subcategories as sc 
LEFT JOIN needs_goals as g 
ON sc.ID=g.subcategory_id
function processResults(collection, groupKey) {
    var result = _.chain(collection)
                  .groupBy(groupKey)
                  .toPairs()
                  .map(function (currentItem) {
                      // 'text' and 'children' are the keys I want in my resulting object
                      // children being the property that contains the array of goal objects
                      return _.zipObject(['text', 'children'], currentItem);
                  })
                  .value();
    return result;
}

这将导致目标分组的对象数组!由于我现在用硬编码的键名构造函数,它只适用于我的特定情况,如果你想概括函数,你可以添加参数并用这些参数替换硬编码的键名。

上次我检查没有从JS直接访问mysql,所以..单次查询无法给出上述结果。获取所有数据并根据需要转换数据。lodashjs可能是非常有用的工具。如果您正在nodejs应用程序中获取数据或将数据发送到浏览器。@RC。我只是用JS格式来说明我想要返回的数组。。我使用的是NodeJS,它使用的格式与我看到的相同,你不认为你应该在你的问题中说明这一点吗?因此,您应该编辑并发布您的nodeJs代码,并添加一个nodeJs标记。这听起来像是一项工作。我希望您不要在生产代码中这样做,因为使用字符串连接将内容猛击到查询中非常可怕。将准备好的语句与占位符值一起使用。这些在Node.js中也可以使用。Yes。。。评论就是这么说的。你可能想使用准备好的语句,我只是在简化。哦,只有当你滚动的时候才可见,但是好的。没关系,谢谢你指出,其他人也可能看不到。