我正在使用yii2框架并尝试建立关系,但是如果可能的话,需要简化查询,以便可以在内部使用。
我的桌子
CREATE TABLE image (
id int(11) UNSIGNED NOT NULL,
type varchar(32) NOT NULL,
file_id int(11) UNSIGNED NOT NULL,
device tinyint(4) UNSIGNED NOT NULL,
PRIMARY KEY (file_id, device, id, type)
)
ENGINE = INNODB,
AVG_ROW_LENGTH = 93,
CHARACTER SET utf8mb4,
COLLATE utf8mb4_unicode_ci;
ALTER TABLE image
ADD UNIQUE INDEX UK_image (id, type, file_id, device);
/* `id` is the PK of related content data */
/* `type` is a string identifier of the image */
/* `file_id` is the PK of the file data */
/* `device` is an identifiery of the device the image is for */
INSERT INTO image (id, type, file_id, device)
VALUES
(1, 'item:thumb', 1, 1),
(1, 'item:thumb', 3, 2),
(1, 'item:thumb', 2, 3),
(1, 'item:thumb', 4, 1),
(2, 'item:thumb', 1, 1);
有效的查询
SELECT id, JSON_OBJECTAGG(b.type, b.o) AS images
FROM (
SELECT id, type, JSON_OBJECTAGG(a.device, a.f) AS o
FROM (
SELECT id, type, device, JSON_ARRAYAGG(i.file_id) AS f
FROM image i
WHERE i.id IN (1, 2) AND i.type IN ('item:thumb')
GROUP BY i.id, i.type , i.device
) a
GROUP BY id, a.type
) b
GROUP BY b.id;
我希望能奏效,但会出现有关组功能的错误。
SELECT id, JSON_OBJECTAGG(i.type, JSON_OBJECTAGG(i.device, JSON_ARRAYAGG(i.file_id))) AS f
FROM image i
WHERE i.id IN (1, 2) AND i.type IN ('item:thumb')
GROUP BY i.id, i.type , i.device;
获得结果