Выборка из таблицы, где в поле не должны повторяться значения?

Alpha777

Новичок
Выборка из таблицы, где в поле не должны повторяться значения?

Необходимо сделать выборку из таблицы, где во всех выбранных значениях (строчках), значения в одном из выбранных полей были различны!!

Пример:
tabl1

id | name | count_1 | count_2
1 | user_1 | 45 | 345
2 | user_2 | 34 | 654
3 | user_2 | 84 | 743
4 | user_3 | 27 | 134
5 | user_4 | 38 | 364

Выберем 3 значения например по id
Но ответ должен быть не
1 | user_1 | 45 | 345
2 | user_2 | 34 | 654
3 | user_2 | 84 | 743

А вот такой
1 | user_1 | 45 | 345
2 | user_2 | 34 | 654
4 | user_3 | 27 | 134

Т.е. т.к. в поле name user_2 попался 2 раза вторую запись пропустили!

Может сформулировал немного коряво, но очень нужно знать ответ!
 

Alpha777

Новичок
GROUP BY Все одинаковые поля замещает первым а можно последним desc не подходит!
 

SelenIT

IT-лунатик :)
Alpha777
В базе нет "первых" и "последних" записей.

alpine
Если я правильно понял и нужно выбирать count_1 и count_2, соответствующие максимальному id для каждого name - MAX() имхо не поможет. Если не ошибаюсь, для этого нужно джойнить таблицу саму на себя...
 

alpine

Новичок
SelenIT
Ага, точно.

-~{}~ 26.07.05 21:42:

Кажется это делается так:
[sql]
CREATE TEMPORARY TABLE tmp (
id INT(4) UNSIGNED NOT NULL,
count_1 int(11) UNSIGNED NOT NULL);
LOCK TABLES t read;
INSERT INTO tmp SELECT id, MAX(count_1) as count_1 FROM t GROUP BY name;
SELECT t.id, t.name, tmp.count_1, t.count_2 FROM t, tmp
WHERE t.id=tmp.id;
UNLOCK TABLES;
DROP TABLE tmp;
[/sql]
 

Alpha777

Новичок
Интересное решение через временную таблицу.
А я нашёл через массивы:

$res = mysql_query("SELECT id, count FROM t order by id");
while ($row=mysql_fetch_array ($res)) {
$arr[]=$row['count'];
}

$arr = array_flip ($arr);
arsort($arr);
$arr = array_flip ($arr);
// Выводим данные
foreach ($arr as $arr) {
++$i;
echo " Значение $i: $arr\n<br>";
}

На выходе тот же самый GROUP BY только свидённый не к младшему а к старшему id.
Единственное возможно можно код сделать поменьше но я других подходящих функций для массива не знаю...
 

alpine

Новичок
Alpha777
Если тебе нужно с большим id то запрос нужно модифицировать, так как сейчас он выбирает с максимальных count_id.
[sql]
CREATE TEMPORARY TABLE tmp(
id INT( 4 ) UNSIGNED NOT NULL
);

LOCK TABLES t READ ;

INSERT INTO tmp
SELECT MAX( id ) AS id
FROM t
GROUP BY name;

SELECT t.id, t.name, t.count_1, t.count_2
FROM t, tmp
WHERE t.id = tmp.id;

UNLOCK TABLES ;

DROP TABLE tmp;
[/sql]
 

antson

Новичок
Партнер клуба
вариант для mssql или mysql > 4

select * from tab1 where id in (select max(id) from tab1 group by name)

тут в обсуждение несовсем понятно . в исходном примере отобраны строки с наименьшим id для конкретного имени,
а по треду почемуто все говорят про максимум.

вообщем писать min() или max() решать Alpha777 его задание.
 
Сверху