繁体   English   中英

MYSQL GROUP_CONCAT和IN

[英]MYSQL GROUP_CONCAT and IN

我有一个查询,它是这样的:

它比看起来稍微复杂一些,唯一的问题是使用一个子查询的输出作为IN子句的参数来生成另一个子查询。 它可以在某种程度上起作用-但它仅提供“ IN”子句中第一个ID的结果。 奇怪的是,如果我手动插入记录ID“ 00003,00004,00005”,它的确会给出正确的结果。

我想要做的是获得二级多对多关系-基本上,游览站有项目,而项目又有图像。 我正在尝试从所有项目中获取所有图像,并将它们作为“ 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]

IN子查询中的GROUP_CONCAT

任何见解都表示赞赏。 谢谢

我很惊讶您可以在子查询中使用rel_items

您可以尝试:

 concat(',', images.attached_to, ',') like concat('%,', rel_items, ',%') and

这可能会或可能不会更快。 原始版本之所以快速,大概是因为没有匹配项。

或者,您可以尝试更改in子句。 有时,这些优化效果不佳:

exists (select 1
        from tour_stop_item
        where tour_stops_id = tour_stops.record_id and images.attached_to = item_id
       )

然后确保您在tour_stop_item(tour_stops_id, item_id)上有一个索引。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM