2010-07-31 3 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 
Смежные вопросы