Какой правильный путь? С помощью JavaScript и MySQL - PullRequest
0 голосов
/ 16 мая 2019

У меня есть таблица mysql под названием «автомобили», где я храню: «бренд», «модель», «цвет». Я хотел бы получить данные как это:

[
    {
        brand: "audi",
        cars: [
            {
                "model": "coupe",
                "color": "red",
            },
            {
                "model": "a3",
                "color": "blue",
            },
        ]
    },
    {
        brand: "renault",
        cars: [
            {
                "model": "modus",
                "color": "white",
            },
            {
                "model": "clio",
                "color": "green",
            },
        ]
    },
    ...
]

Итак, я делаю первый запрос MySQL, в котором я группирую по марке, а затем повторяю результат, чтобы получить все машины для каждой марки:

const query = "SELECT brand FROM cars GROUP BY brand"
mysql.query(query, values, (err, result) => {
    for (let i = 0; i < result.length; i++) {
        const query2 = "SELECT model, color FROM cars WHERE brand = ?"
        const values2 = [result[i].brand]
        mysql.query(query2, values2, (err2, result2) => {
            result[i].cars = result2
            callback(result)
        })
    }
})

Код, который я показываю, работает, но я не думаю, что выполнение итерации для запроса MySQL - хорошая вещь.

Я провел много исследований, и я действительно не знаю, что делать.

Можно ли получить этот результат с помощью одного запроса MySQL? Или я должен получить все строки из таблицы "cars", а затем выполнить JS для форматирования данных? Или я должен продолжать использовать эту итерацию запроса MySQL?

Спасибо

Ответы [ 3 ]

0 голосов
/ 16 мая 2019

Нечто подобное должно сработать. Его трансформация на стороне клиента:

let carArr = []

const query = "SELECT brand, model, color from cars"
mysql.query(query, values, (err, result) => {
    for (let i = 0; i < result.length; i++) {
        // Get the index of the brand in the carArr array
        let brandIndex = carArr.map(c => c.brand).indexOf(result.brand)

        // If the brand is not already in carArr, enter a new value for it
        if(brandIndex == -1)
            carArr.push({"brand": result.brand, "cars": [{"model": result.model, "color": result.color}]})

        // If the brand already exists, add the car type to this specific barnd
        else
            carArr[brandIndex].cars.push({"model": result.model, "color": result.color})
    }
})
0 голосов
/ 16 мая 2019

Мы можем достичь одним запросом, используя GROUP_CONCAT, CONCAT mysql.как только вы получите результат, ключом машины станет строка JSON.вы можете конвертировать, используя метод JSON.parse

select brand,CONCAT("[",GROUP_CONCAT(CONCAT("{'model':'",model,"','color':'",color,"'}")),"]") as cars from cars GROUP BY brand;
0 голосов
/ 16 мая 2019

Вы можете сделать что-то вроде:

const carsByBrand=[],brands={};  
function find(){
 const query = "SELECT model, color FROM cars WHERE brand IN ('renault','bmw')"
 mysql.query(query, values, (err, result) => {
    /*assuming value  to be like: [
            {
              brand:audi,
                "model": "coupe",
                "color": "red",
            },
            ]
       */

  values.forEach((car)=>{
      if(brands[car.brand]){
        carsByBrand[brands[car.brand]].cars.push(car)
      }else{
        let index=carsByBrand.push({
          brand:car.brand,
          cars:[car]
        })
        brands[car.brand]=index;
      }
    })    
  }
 })

}
find()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...