[identity profile] haviras.livejournal.com posting in [community profile] useful_faq
Как на SQL сделать так что бы пара полей (именно пара, по отдельности могут быть одинаковыми), а что бы пара была в кол-ве 1 штука?

Может быть средствами Денвера это как то сделать можно?


Поля в таблице
id, login, date, exp

Надо что бы пара login и date была уникальная.

Date: 2008-12-25 12:43 pm (UTC)
From: [identity profile] sergey-sht.livejournal.com
1. ... GROUP BY field1, field2

2. SELECT DISTINCT ...

В зависимости от смысла запроса.

Date: 2008-12-25 12:48 pm (UTC)
From: [identity profile] sergey-sht.livejournal.com
1. SELECT DISTINCT login, date
FROM ...

2. SELECT login, date, <+ агрегатные функции>
FROM table
GROUP BY login, date

Date: 2008-12-25 01:14 pm (UTC)
From: [identity profile] czz.livejournal.com
А, вам надо для записи, а не для выбора?
Сейчас придумаю :)

Date: 2008-12-25 01:16 pm (UTC)
From: [identity profile] czz.livejournal.com
Создать уникальный индекс по login+date: ALTER TABLE table ADD UNIQUE INDEX (login, date), после чего использовать REPLACE вместо INSERT:
REPLACE INTO table (login, date, id, exp) VALUES (....)

Это mysql. Не уверен, что REPLACE есть в других диалектах.
Edited Date: 2008-12-25 01:16 pm (UTC)

Date: 2008-12-25 04:14 pm (UTC)
From: [identity profile] czz.livejournal.com
Не совсем понял вопрос.
Т.е. надо в имеющейся базе удалить дубликаты?

Date: 2008-12-25 04:28 pm (UTC)
From: [identity profile] czz.livejournal.com
Чтобы убрать:
ALTER IGNORE TABLE table ADD UNIQUE INDEX (login, date).
Будет создан уникальный индекс и дубликаты будут удалены.
После этого использовать REPLACE для записи (см. прошлый коммент).

Date: 2008-12-25 01:14 pm (UTC)
From: [identity profile] czz.livejournal.com
В mysql-е можно так:
SELECT id, login, date, exp FROM table GROUP BY login, date
- если пары login+date уникальные, то неопределённости не будет, если неуникальные - возьмёт для каждой пары первую попавшуюся строку.

В стандартном SQL, если не ошибаюсь, такое не допускается, и поля, не входящие в GROUP BY, могут присутствовать только внутри агрегатных функций.
Тогда:
SELECT MIN(id), login, date, MIN(exp) FROM table GROUP BY login, date
- опять же, в случае уникальности пар неопределённости нет, в случае неуникальности - неопределённость разрешается с помощью MIN, но при этом id и exp могут попасться из разных строк.

Не забудьте сделать индекс по login+date, иначе всё будет очень медленно.

Date: 2008-12-25 01:16 pm (UTC)
From: [identity profile] solonin.livejournal.com
не знаю какая у Вас БД, но для firebird можно сделать с использованием ограничения таблицы UNIQUE и перечислением полей.

Само собой что при этом нужно перехватывать эксепшны от сервера.

Date: 2008-12-25 01:35 pm (UTC)
From: [identity profile] hilda67.livejournal.com
ключ уникальный по двум полям создать? самое простое решение. наложить constraint.

За уникальность...

Date: 2008-12-25 02:19 pm (UTC)
From: [identity profile] wamana.livejournal.com
...отвечают ключи. Это азбука...