2015-07-27 4 views
0

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

Я создал соединительную таблицу AssemblyComponent, которая создает «рецепты» для сборок.

Я хочу, чтобы иметь возможность собрать сборку на основе набора компонентов. Если компоненты не соответствуют какой-либо сборке, возвращается NULL.

Assembly 
assemblyid INT 

Component 
componentid INT 

AssemblyComponent 
assemblyid INT 
componentid INT 
numberofcomponents INT 

Так что цель состоит в том, чтобы иметь хранимую процедуру, которая будет принимать переменное число компонентов и вернуть узел (должна быть только один для данного набора компонентов), которые соответствуют набору компонентов. Я использую mysql 5.1.x, поэтому я не могу передать массив хранимой процедуре. Я бы просто создал восемь параметров IN и установил неиспользованные значения NULL.

Меня больше интересует, какой подход запроса использовать, а не фактически писать код процедуры в это время. Если мне нужно изменить структуру таблицы, я тоже могу это сделать. Благодарю.

+0

Два вопроса: 1> Вы считаете это совпадением, если список указанных компонентов является подмножеством? например 4 компонента, указанные в качестве входных данных, и они соответствуют узлу, имеющему 5 компонентов. 2> Рассматривается ли число компонентов в сопоставлении? – Sameer

+0

1. Нет. Количество компонентов и типов должно совпадать. –

+0

2. Да, важно число –

ответ

1

Если этот запрос является очень важной частью приложения, и вы готовы изменить схемы и код приложения, чтобы эффективно сделать эту работу запросов и чисто, я хотел бы предложить вам изменить AssemblyComponent таблицу. Сделайте одну строку таблицы равным assemblyid. Добавить 16 столбцов - 8 для componentid и 8 для соответствующих numberofcomponents.

**AssemblyComponent** 
assemblyid INT 
componentid1 INT 
numberofcomponents1 INT 
componentid2 INT 
numberofcomponents2 INT 
.... 

Во время вставки/обновления в этой таблице вы должны убедиться, что componentid s сортируются слева направо в ряд. При запросе вам нужно снова убедиться, что параметры componentid отсортированы аналогично. Теперь ваш запрос простого SELECT запроса с WHERE пунктом, такие как:

WHERE 
     componentid1=componentid1arg 
    AND numberofcomponents1=numberofcomponents1arg 
    AND componentid2=componentid2arg 
    AND numberofcomponents2=numberofcomponents2arg 
.... 

Выше запроса необходимо модифицировать, чтобы сравнить аннулирует правильно (= может не работать нули). Обеспечение заказа componentid может быть выполнено в коде или через сохраненную процедуру.

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

+0

Это то, что я делал. Там количество сборок относительно невелико, поэтому мне было легко и хранилище данных. –

0

Как насчет этого? Предположим, вы знаете значения componentid данных компонентов.

Затем вы можете сделать что-то вроде этого:

SELECT COUNT(*) matching, 
     assemblyid 
    WHERE componentId IN (your set of componentid values) 
    GROUP BY assemblyid 
    ORDER BY COUNT(*) DESC 
    LIMIT 1 

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

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