我有一个小问题,它是这样的:
它比看起来稍微复杂一些,唯一的问题是使用一个子查询的输出作为 IN 子句的参数来生成另一个子查询。它在某种程度上有效 - 但它只提供“IN”子句中第一个 id 的结果。奇怪的是,如果我手动插入记录 ID“00003,00004,00005”,它确实会给出正确的结果。
我想要做的是获得二级多对多关系 - 基本上 tour_stops 有项目,而这些项目又有图像。我正在尝试将所有项目中的所有图像作为“item_images”放在 JSON 字符串中。如前所述,它运行得很快,但只返回第一个相关项目的图像。
SELECT DISTINCT
tour_stops.record_id,
(SELECT
GROUP_CONCAT( item.record_id ) AS in_item_ids
FROM tour_stop_item
LEFT OUTER JOIN item
ON item.record_id = tour_stop_item.item_id
WHERE tour_stop_item.tour_stops_id = tour_stops.record_id
GROUP BY tour_stops.record_id
) AS rel_items,
(SELECT
CONCAT('[ ',
GROUP_CONCAT(
CONCAT('{ \"record_id\" : \"',record_id,'\",
\"photo_credit\" : \"',photo_credit,'\" }')
)
,' ]')
FROM images
WHERE
images.attached_to IN(rel_items) AND
images.attached_table = 'item'
ORDER BY img_order ASC) AS item_images
FROM tour_stops
WHERE
tour_stops.attached_to_tour = $record_id
ORDER BY tour_stops.stop_order ASC
我尝试了以下两个答案,但没有帮助。第二个示例(将整个第一个子查询放在他的“IN”语句中)不仅产生了我已经得到的相同结果,而且还成倍地增加了查询时间。
编辑:我将我的 IN 语句替换为
IN(SELECT item_id FROM tour_stop_item WHERE tour_stops_id = tour_stops.record_id)
它可以工作,但现在速度非常慢。假设我已正确索引所有内容,这是最好的方法吗?
在 PHPMYADMIN 中使用 group_concat 将结果显示为 [BLOB - 3B]
任何见解都值得赞赏。谢谢