2010-07-31 82 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