代码之家  ›  专栏  ›  技术社区  ›  Māris Kiseļovs

在包含组\u CONCAT的查询中忽略限制

  •  9
  • Māris Kiseļovs  · 技术社区  · 14 年前

    我需要从第二个表中选择一些行,并用逗号分隔的字符串连接它们。除了一个问题外,查询工作得很好—它总是选择所有行并忽略限制。

    这是我的查询的一部分,它获取该字符串并忽略限制:

    select 
        group_concat(value order by `order` asc SEPARATOR ', ') 
    from slud_data 
        left join slud_types on slud_types.type_id=slud_data.type_id 
    where slud_data.product_id=18 and value!='' and display=0 limit 3;
    
    
    // Result:
    +---------------------------------------------------------+
    | group_concat(value order by `order` asc SEPARATOR ', ') |
    +---------------------------------------------------------+
    | GA-XXXX, Bentley, CONTINENTAL FLYING SPUR, 2006         |
    +---------------------------------------------------------+
    
    // Expected result: (only 3 comma-separated records, not 4)
    

    SELECT *,product_id id,
        (select group_concat(value order by `order` asc SEPARATOR ', ') from slud_data left join slud_types on slud_types.type_id=slud_data.type_id where slud_data.product_id=t1.product_id and value!='' and display=0 limit 3) text
    FROM slud_products t1 
    WHERE 
        now() < DATE_ADD(date,INTERVAL +ttl DAY) and activated=1
    ORDER BY t1.date desc
    
    3 回复  |  直到 14 年前
        1
  •  12
  •   Mark Byers    14 年前

    LIMIT子句限制最终结果集中的行数,而不是用于在组\u CONCAT中构造字符串的行数。因为您的查询在最终结果中只返回一行,所以限制不起作用。

    您可以通过构造一个限制为3的子查询来解决问题,然后在外部查询中对该子查询的结果应用groupconcat。

        2
  •  11
  •   Community trashgod    7 年前

    由于以下原因,您的查询未按预期工作 @Mark Byers outlined in the other answer . 您可以尝试以下操作:

    SELECT  GROUP_CONCAT(`value` ORDER BY `order` ASC SEPARATOR ', ') 
    FROM    (
               SELECT    `value`, `order`
               FROM      slud_data 
               LEFT JOIN slud_types ON slud_types.type_id = slud_data.type_id 
               WHERE     slud_data.product_id = 18 AND value != '' AND display = 0 
               LIMIT     3
            ) a;
    
        3
  •  0
  •   Phil LaNasa    11 年前

    马克·拜尔斯思想的一个例子:

    SELECT GROUP_CONCAT(id, '|', name) 
    FROM (
    SELECT id, name
    FROM users
    LIMIT 3) inner