Подскажите как составить SQL запрос, что-то вроде группировки

GrayMaster

Новичок
Подскажите как составить SQL запрос, что-то вроде группировки

Добрый день!
Подскажите как составить следующий запрос:
Запросом: SELECT * FROM `table` GROUP BY `f1`, я получаю записи из таблицы, где поле "f1" является уникальным.
Как сделать запрос, в результате которого поле "f1" может повторять не более 2х раз ? Т.е. чтоб в результате поле "f1" не было уникальным, но не повторялось более 2-х раз.

Пример:
Есть таблица:
Код:
f1|f2
1|1
1|2
1|3
1|4
2|1
2|2
2|3
2|4
3|1
Необходимо сделать выборку так, чтоб в результате было следующее:
Код:
1|1
1|2
2|1
2|2
3|1
Спасибо.
 

Mols

Новичок
Хм... ну по разному это можно... как вариант использование count() GROUP_CONCAT() и HAVING, результат будет в неcколько другом виде, но будет содержать всю необходимую информацию.
Но вообще то (если таблица предполагает быть большой, а запросы более менее частыми), не очень правильно всё как то выглядит.
 

GrayMaster

Новичок
Мои догадки как такое сделать: при выборке, предварительно просчитывать кол-во вхождений повторяющегося поля, и нумеровать его. Далее делать выборку где номер вхождения менее N например.
Подскажите пожалуйста как такое реализовать?
 

alpine

Новичок
GrayMaster
1) Через пользовательские переменные, например так
Код:
SET @cur_group='', @g_counter=0;
SELECT * FROM (
SELECT
	t.*,
	@g_counter:=IF(f1=@cur_group,@g_counter+1,0) as counter,
	@cur_group:=IF(f1=@cur_group,@cur_group,f1) as cgroup
FROM t
ORDER BY f1,f2
) as tmp WHERE counter<2;
2) С использованием автоинкремента и праймари кея по двум полям, например так
Код:
CREATE TABLE `t2` (                             
          `f1` int(11) NOT NULL,                       
          `f2` int(11) NOT NULL,                       
          `group_id` int(11) NOT NULL auto_increment,  
          PRIMARY KEY  (`f1`,`group_id`)               
        );
INSERT INTO t2 SELECT * FROM t ORDER BY f1,f2;
SELECT * FROM t2 WHERE group_id<3;
 
Сверху