Mysql Предельное значение столбца повторение N раз - PullRequest
3 голосов
/ 14 июня 2010

У меня есть две таблицы

Customer (idCustomer, ecc.. ecc..)
Comment (idCustomer, idComment, ecc.. ecc..)

очевидно, две таблицы объединены, например,

SELECT * FROM Comment AS co
  JOIN Customer AS cu ON cu.idCustomer = co.idCustomer

При этом я выбираю все комментарии из этой таблицы, связанные с клиентом, нотеперь я хочу ограничить количество комментариев максимум 2 комментариями на одного клиента.

Первое, что я вижу, это использование GROUP BY cu.idCustomer, но оно ограничивает только 1 комментарий на клиента, но я хочу 2 комментария на клиента.

Как мне этого добиться?

Ответы [ 5 ]

3 голосов
/ 14 июня 2010

Один из вариантов в MySQL - переменные на стороне сервера.Например:

set @num := 0, @customer := -1;

select  *
from    (
        select  idCustomer
        ,       commentText
        ,       @num := if(@customer = idCustomer, @num + 1, 1) 
                    as row_number
        ,       @customer := idCustomer
        from    Comments
        order by 
                idCustomer, PostDate desc
        ) as co
join    Customer cu
on      co.idCustomer = cu.idCustomer
where   co.row_number <= 2
2 голосов
/ 14 июня 2010
SELECT * FROM Comments AS cm1 
         LEFT JOIN Comments AS cm2 ON cm1.idCustomer = cm2.idCustomer 
         LEFT JOIN Customer AS cu ON cm1.idCustomer = cu.idCustomer
WHERE cm1.idComment != cm2.idComment
GROUP BY cm1.idCustomer

Однако, если вы собираетесь изменить количество комментариев, лучше использовать решение Andomar .

2 голосов
/ 14 июня 2010

Эта версия не требует операции SET:

select  *
from    (select  idCustomer
         ,       commentText
         ,       @num := if(@customer = idCustomer, @num + 1, 1) as row_number
         ,       @customer = idCustomer
         from    Comments
         JOIN(SELECT @num := 0, @customer := 1) r
         order by idCustomer, PostDate desc) as co
 join    Customer cu on co.idCustomer = cu.idCustomer
 where   co.row_number <= 2
0 голосов
/ 01 февраля 2012

Если вы используете язык сценариев, такой как PHP, для обработки результатов, вы можете ограничить число результатов, отображаемых для каждого клиента после выполнения запроса.Настройте массив для хранения всех результатов, настройте другой массив для хранения количества результатов на одного клиента и прекратите добавлять результаты запроса в набор результатов после того, как число превысит ваш лимит, например:

$RESULTS = array();
$COUNTS = array();
$limit = 2;
$query = "SELECT customer_id, customer_name, customer_comment FROM customers ORDER BY RAND()";
$request = mysql_query($query); 
while ($ROW = mysql_fetch_assoc($request))
{
    $c = $ROW['customer_id'];
    $n = $COUNTS[$c];
    if ($n<$limit)
    {
         $RESULTS[] = $ROW;
         $COUNTS[$c]++;
    }
}

Это гарантирует, что только два комментария для каждого клиента будут отображаться в случайном порядке или, как вы хотите, остальные будут выброшены.Конечно, вы извлекаете ВСЕ результаты, но это (возможно) быстрее, чем сложное соединение.

0 голосов
/ 11 января 2011

Нет необходимости использовать курсор, который очень медленный.См. Мой ответ на Сложный SQL-запрос о присоединении и ограничении .DENSE_RANK выполнит трюк без всяких сложностей с курсором.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...