2013-04-08 5 views
-2

У меня есть таблица рецептов, которая строится так:Как запросить таблицу поиска для уникальных значений?

product2recipe 
id | productid | recipeid 

Я хочу, чтобы исключить вставку повторяющихся значений. В основном рецепт может содержать 1 или более продуктов. Так это выглядит следующим образом:

1 | 1 | 1 
2 | 2 | 1 
3 | 1 | 2 
4 | 5 | 3 

Пользователь может представить новый рецепт, если рецепт содержит аналогичное значение, как:

id | 1 | 4 
id | 2 | 4 

Тогда он не должен подавать, потому что таблица уже есть повторяющиеся значения, recipeid 1 уже содержит продукты 1 и 2. Если это:

id | 1 | 5 
id | 3 | 5 

Тогда он должен быть отправлен, поскольку это уникальная комбинация.

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

+0

Вы ищете запрос на запись, который будет возвращать все повторяющиеся рецепты (или просто количество повторяющихся рецептов), или вы хотите, чтобы ограничение БД предотвращало вставку повторяющихся рецептов? (Я не уверен, что последнее возможно.) –

+0

Кстати, это на самом деле будет база данных рецептов, или это «рецепт» просто пример подобного типа организации данных? –

ответ

0

Дать п известный набор продуктов для «нового» рецепта, я хотел бы предложить, выполнив следующий запрос:

select recipeid 
from product2recipe 
group by recipeid 
having count(distinct productid) = 
     count(distinct case when productid in (?,?,...) then productid end) 

- рецепты возвращаемых будет иметь один и тот же набор продуктов в качестве «нового» рецепта; ваше приложение затем должно быть запрограммировано на отклонение таких «новых» рецептов.

+0

icic, будет ли медленнее запускать этот запрос на огромном количестве или рецептах? Я имею в виду, что это лучший способ обеспечить соблюдение моей структуры? – samuelmrrsn

+0

@samuelmrrsn: Насколько огромен «огромный»? Вероятно, это зависит от ряда факторов, таких как количество строк, память сервера баз данных, скорость диска и т. Д. Лучший способ проверить - запустить тестовые запросы с тестовой базой данных с реалистичным количеством записей, так как это скорее всего, будет работать медленнее по мере увеличения количества записей. –

+0

ic .. hmm sick просто подождите и выясните это в следующий раз, так как это только локальный сайт в нашей стране, поэтому я не думаю, что он наберет много посетителей. поэтому я думаю, что это будет нормально работать. Спасибо! – samuelmrrsn

3

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

Но в любом случае, вот способ для обеспечения соблюдения UNIQUE ограничения для соединения столбца в таблице,

ALTER TABLE product2recipe ADD CONSTRAINT tb_uq UNIQUE(productid, recipeid) 

раскомментируйте ALTER TABLE заявления в связи demontration выше и посмотреть что происходит

+0

Спасибо, я не знаю, так как im a noob сейчас .. – samuelmrrsn

+0

это именно то, что вы ищете? ':)' –

+1

JW, извините, ответьте сейчас. Мы потеряли интернет-соединение в течение 2 дней .. – samuelmrrsn

Смежные вопросы