자바 스크립트 함수의 SQL (mariaDB) 테이블에 원시 쿼리를 적용하고 있습니다.
::: 업데이트 된 질문 :::
아래는 답변에서 제안한대로 JSON_ARRAY
및 JSON_OBJECT
메서드를 사용해도 시도한 SQL 쿼리를 만드는 자바 스크립트 함수 입니다.
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_arrayagg 또한 json_objectagg 하지만 JSON 객체의 배열을 만들 수 수 없습니다.
PS : MySQL 버전 : 5.5.5-10.3.22-MariaDB
풋 CONCAT
내부를 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));
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
식 으로든 호출하려면 여전히 일부 연결을 수행해야한다고 생각합니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다