LIMIT игнорируется в запросе с GROUP_CONCAT - PullRequest
9 голосов
/ 31 июля 2010

Мне нужно выбрать несколько строк из второй таблицы и объединить их в строку через запятую. Запрос работает хорошо, за исключением одной проблемы - он всегда выбирает все строки и игнорирует LIMIT.

Это часть моего запроса, которая получает эту строку и игнорирует 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

Ответы [ 3 ]

11 голосов
/ 31 июля 2010

Ваш запрос не работает так, как вы предполагали по причинам @ Марк Байерс, обрисованный в общих чертах в ответе .Вместо этого вы можете попробовать следующее:

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;
11 голосов
/ 31 июля 2010

Предложение LIMIT ограничивает количество строк в конечном наборе результатов, а не количество строк, использованных для построения строки в GROUP_CONCAT. Поскольку ваш запрос возвращает только одну строку в конечном результате, LIMIT не действует.

Вы можете решить свою проблему, создав подзапрос с LIMIT 3, затем во внешнем запросе примените GROUP_CONCAT к результату этого подзапроса.

0 голосов
/ 11 ноября 2013

Пример идеи Марка Байерса:

SELECT GROUP_CONCAT(id, '|', name) 
FROM (
SELECT id, name
FROM users
LIMIT 3) inner
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...