'MySQL Combine Group by Column

I am new to SQL statements so my wording per my request may be incorrect, so I will provide a lot of detail to better understand my issue.

I have a database table called workouts that looks like this:

id bodyPart gifUrl name target broad_target
1 back http://d205bpvrqc9yn1.cloudfront.net/0007.gif alternate lateral pulldown lats back
2 chest http://d205bpvrqc9yn1.cloudfront.net/0009.gif assisted chest dip (kneeling) pectorals chest
3 lower legs http://d205bpvrqc9yn1.cloudfront.net/1708.gif assisted lying calves stretch calves legs
4 upper legs http://d205bpvrqc9yn1.cloudfront.net/1709.gif assisted lying glutes stretch glutes legs
5 upper legs http://d205bpvrqc9yn1.cloudfront.net/1710.gif assisted lying gluteus and piriformis stretch glutes legs
6 back http://d205bpvrqc9yn1.cloudfront.net/0015.gif assisted parallel close grip pull-up lats back

and I want it to combine all the broad_muscles together and wrap it under an array called data.

Ideally, it would look like this:

{
    title: 'Leg',
    data:[
        {
      "bodyPart": "lower legs",
      "equipment": "assisted",
      "gifUrl": "http://d205bpvrqc9yn1.cloudfront.net/1708.gif",
      "id": "1708",
      "name": "assisted lying calves stretch",
      "target": "calves",
      "broad_target": "legs",
      "ppl": "legs"
    },
    {
      "bodyPart": "lower legs",
      "equipment": "smith machine",
      "gifUrl": "http://d205bpvrqc9yn1.cloudfront.net/1396.gif",
      "id": "1396",
      "name": "smith toe raise",
      "target": "calves",
      "broad_target": "legs",
      "ppl": "legs"
    }
  ]
}

I will return it via. Lambda in Node.JS, so if needed, the answer can be how to parse it in Node.JS.

Thanks!



Solution 1:[1]

You can something do like this, but if your o/p formats in an array. You should use any SQL orms that can be helpful.

const sampleData = [{           
    "id":"1",
     "bodyPart":"back",
      "gifUrl": "http://d205bpvrqc9yn1.cloudfront.net/0007.gif",
      "name": "alternate lateral pulldown" ,    
      "target": "lats",
      "broad_target" : "back"
},{
 "id":"2",
     "bodyPart":"chest",
      "gifUrl": "http://d205bpvrqc9yn1.cloudfront.net/0007.gif",
      "name": "assisted chest dip (kneeling)" , 
      "target": "pectorals",
      "broad_target" : "chest"
},{
     "id":"2",
     "bodyPart":"upper legs",
      "gifUrl": "http://d205bpvrqc9yn1.cloudfront.net/0007.gif",
      "name": "assisted chest dip (kneeling)" , 
      "target": "glutes",
      "broad_target" : "legs"
},{
     "id":"2",
     "bodyPart":"lower legs",
      "gifUrl": "http://d205bpvrqc9yn1.cloudfront.net/0007.gif",
      "name": "assisted chest dip (kneeling)" , 
      "target": "calves",
      "broad_target" : "legs"
}];

const matchString = "legs";

const output = sampleData.reduce((prev, current) => {
    if (current?.broad_target === matchString) {
        prev['title'] = "Leg";
        prev['data'] = (prev['data'] || []);
        prev['data'].push(current);
    }
    return prev
},{});

console.log(output);

Note: I have taken sample o/p as the sample the information might not match the actual data.

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Apoorva Chikara