2010-07-31 30 views
9

Tôi cần phải chọn một số hàng từ bảng thứ hai và nối chúng trong chuỗi được phân cách bằng dấu phẩy. Truy vấn hoạt động tốt ngoại trừ một vấn đề - Nó luôn chọn tất cả các hàng và bỏ qua LIMIT.LIMIT bị bỏ qua trong truy vấn với GROUP_CONCAT

Đây là một phần của truy vấn của tôi mà được chuỗi đó và bỏ qua 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) 

Full truy vấn:

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 

Trả lời

10

Các LIMIT khoản giới hạn số lượng hàng trong tập kết quả cuối cùng, không số hàng được sử dụng để tạo chuỗi trong GROUP_CONCAT. Vì truy vấn của bạn chỉ trả về một hàng trong kết quả cuối cùng nên LIMIT không có hiệu lực.

Bạn có thể giải quyết vấn đề của mình bằng cách tạo truy vấn con với LIMIT 3, khi đó truy vấn bên ngoài áp dụng GROUP_CONCAT cho kết quả của truy vấn con đó.

11

Truy vấn của bạn không hoạt động như bạn dự định vì lý do @Mark Byers outlined in the other answer. Bạn có thể muốn thử những điều sau đây thay vì:

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

Một ví dụ của Mark Byers ý tưởng:

SELECT GROUP_CONCAT(id, '|', name) 
FROM (
SELECT id, name 
FROM users 
LIMIT 3) inner 
Các vấn đề liên quan