MYSQL GROUP_CONCAT 和 IN

Posted

技术标签:

【中文标题】MYSQL GROUP_CONCAT 和 IN【英文标题】:MYSQL GROUP_CONCAT and IN 【发布时间】:2013-03-08 18:15:30 【问题描述】:

我有一个小问题,它是这样的:

它比看起来稍微复杂一些,唯一的问题是使用一个子查询的输出作为 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)

它可以工作,但现在速度非常慢。假设我已正确索引所有内容,这是最好的方法吗?

using group_concat in phpMYADMIN will show the result as [BLOB - 3B]

GROUP_CONCAT in IN Subquery

感谢任何见解。谢谢

【问题讨论】:

【参考方案1】:

我很惊讶你可以在子查询中使用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) 上有一个索引。

【讨论】:

这很好用。通过使用“唯一”索引,速度大大提高。谢谢。确切的变化: SELECT GROUP_CONCAT(tour_stop_item.tour_stops_id ) AS in_item_ids FROM tour_stop_item WHERE tour_stops_id = tour_stops.record_id GROUP BY tour_stops.record_id

以上是关于MYSQL GROUP_CONCAT 和 IN的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 使用 JOIN 和 GROUP_CONCAT

MySQL:使用 JOIN 和 GROUP_CONCAT 进行更新

Mysql 中的group_concat函数的使用及陷阱

Mysql 中的group_concat函数的使用及陷阱

MySQL - GROUP_CONCAT 返回重复数据,不能使用 DISTINCT

当我在查询中使用“GROUP_CONCAT”和“HAVING”时如何计算 MySQL 结果?