programing

JavaScript + MariaDB: json 개체 배열을 반환하고 응답에서 '\' 포워드 슬래시를 제거하는 SQL 쿼리

megabox 2023. 9. 6. 21:59
반응형

JavaScript + MariaDB: json 개체 배열을 반환하고 응답에서 '\' 포워드 슬래시를 제거하는 SQL 쿼리

javascript 기능으로 sql(mariaDB) 테이블에 raw 쿼리를 적용하고 있습니다.

::: 업데이트된 질문 :::

아래는 sql 쿼리를 만들기 위한 javascript 함수이며, 이 함수는 제가 시도한 것이기도 합니다.JSON_ARRAY그리고.JSON_OBJECT답변에 제시된 방법들

public async getProducts() {
  try {
  let productTbl = '`products`';
  let prodImgTbl = '`product_images_ids`';
  let productImg = '`product_images`';

  let query = `SELECT 
  ${productTbl}.id AS productId,
  GROUP_CONCAT(JSON_ARRAY(JSON_OBJECT(
    "imageId", ${prodImgTbl}.id, 
    "imageUrl", ${productImg}.thumbnail_image
  ))) imageData,

  FROM ${productTbl} 
  JOIN ${prodImgTbl} ON ${prodImgTbl}.product_id = ${productTbl}.id
  JOIN ${productImg} ON ${productImg}.id = ${prodImgTbl}.product_image_id
  GROUP BY ${productTbl}.id `

  let records = await pool.query(query);
  return records
  } catch (error) {
  throw error;
  }
}

이 쿼리를 사용하여 아래와 같이 우체부에서 결과를 얻고 있습니다.\각각의 키와 값에 적용할 수 있습니다.

this.productList = [
  {
    "productId": 3,
    "imageData": "[{\"imageId\": 17, \"imageUrl\": \"/assets/images/321/1/1/1/image.jpg\"}],[{\"imageId\": 18, \"imageUrl\": \"/assets/images/322/image.jpg\"}]",
  }
]

위 컬렉션을 루프로 이동하려고 하면 다음과 같은 오류가 발생합니다.TypeError: lists.imageData.map is not a function

this.productList.map((lists) => {
  lists.imageData.map((data) => {
    data.imageId
  })
})

그래서 제가 렌더링하고 싶었던 결과는 다음과 같습니다. 그래서 제가 레코드를 순환할 수 있도록 말이죠.

[ RowDataPacket {
    productId: 3,
    imageData [
      {
        imageId: 18,
        imageUrl: /assets/images/321/image.jpg
      },
      {
        imageId: 17,
        imageUrl: /assets/images/322/image.jpg
      }
    ]
  }
]

관리자 도구에서 실행되는 SQL 쿼리

SELECT 
`products`.id AS productId,
GROUP_CONCAT(JSON_ARRAY(JSON_OBJECT(
  "imageId", `product_images_ids`.id, 
  "imageUrl", `product_images`.thumbnail_image
))) imageData
FROM `products`
JOIN `product_images_ids` ON `product_images_ids`.campaign_id = `products`.id
JOIN `product_images` ON `product_images`.id = `product_images_ids`.product_image_id
GROUP BY `products`.id

그리고 여기 관리자가 받는 결과 스크린샷이 있습니다.

json_arrayaggjson_objectagg로 확인했지만 json 객체 배열을 만들 수 없습니다.

추신: MySQL 버전: 5.5.5-10.3.22-마리아DB

퍼팅 aCONCAT안에서.GROUP_CONCAT창조하다, 창조.JSON여기에 목적어

npm인지 잘 모르겠습니다.mariadb모듈이 구조를 파악할 것입니다.

let query = `SELECT 
  ${productTbl}.id AS productId,
  GROUP_CONCAT(
    CONCAT('{imageId:"'${prodImgTbl}'", imageUrl:"'${productImg}.thumbnail_image'"}')) imageData
  FROM ${productTbl} 

  JOIN ${prodImgTbl} ON ${prodImgTbl}.product_id = ${productTbl}.id
  JOIN ${productImg} ON ${productImg}.id = ${prodImgTbl}.product_image_id
  GROUP BY ${productTbl}.id`

안되면 JSON 타입(전체 GROUP_CONCAT 또는 그 안의 모든 표현)으로 캐스팅 해보세요.

CAST(
  CONCAT(
    '[', GROUP_CONCAT(
      CONCAT('{"imageId": "'${prodImgTbl}'", 
        "imageUrl": "'${productImg}.thumbnail_image'"}')),']') 
  AS JSON) imageData

최신 mariadb 버전을 사용하는 경우 JSON_OBJECT가 있습니다.

GROUP_CONCAT(JSON_OBJECT("imageId", ${prodImgTbl}, "imageUrl", ${productImg}.thumbnail_image)) imageData

---편집

전화해도 좋습니다.JSON.parse각각imageData

this.productList = map(pr => ({...pr, imageData: JSON.parse(pr.imageData)}))

이전에 비슷한 질문이 있었고 여기서 그들은 전체 JSON을 쿼리로 만들 것을 제안합니다.

`SELECT JSON_OBJECT(
  'productId',
  ${productTbl}.id,
  'imageData',
  CAST(
    CONCAT(
      '[', GROUP_CONCAT(
        CONCAT('{"imageId": "'${prodImgTbl}'", 
          "imageUrl": "'${productImg}.thumbnail_image'"}')),']') 
  AS JSON)
  )
  FROM ${productTbl} 

  JOIN ${prodImgTbl} ON ${prodImgTbl}.product_id = ${productTbl}.id
  JOIN ${productImg} ON ${productImg}.id = ${prodImgTbl}.product_image_id
  GROUP BY ${productTbl}.id`

유감스럽게도 당신은 여전히 전화를 해야 할 것입니다.JSON.parse

let records = JSON.parse(await pool.query(query));

JSON_OBJECTAGG도 있습니다.

let query = `SELECT 
  ${productTbl}.id AS productId,
  JSON_OBJECTAGG(${prodImgTbl}, ${productImg}.thumbnail_image) imageData
  FROM ${productTbl} 

  JOIN ${prodImgTbl} ON ${prodImgTbl}.product_id = ${productTbl}.id
  JOIN ${productImg} ON ${productImg}.id = ${prodImgTbl}.product_image_id
  GROUP BY ${productTbl}.id`

하지만 제 생각에는 위를 배열로 만들어서 전화를 하려면 아직 연결 작업을 좀 해야 할 것 같습니다.JSON.parse이래저래

언급URL : https://stackoverflow.com/questions/62259357/javascript-mariadb-sql-query-to-return-array-of-json-objects-and-remove-f

반응형