2010-07-31 32 views
9

我需要从第二个表中选择一些行并将它们连接在以逗号分隔的字符串中。除一个问题外,查询效果很好 - 它总是选择所有行并忽略LIMIT。LIMIT在带有GROUP_CONCAT的查询中被忽略

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

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 

回答

10

LIMIT子句限制的行数的最终结果集,不用于在GROUP_CONCAT中构造字符串的行数。由于您的查询在最终结果中只返回一行,因此LIMIT不起作用。

您可以通过构建带有LIMIT 3的子查询来解决您的问题,然后在外部查询中将GROUP_CONCAT应用于该子查询的结果。

11

由于@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; 
0

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

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