2012-03-31 4 views
0

У меня есть таблица под названием cards, которая имеет связанные таблицы brigades и identifiers. Одна карта может иметь несколько бригад и идентификаторов. Я хочу взять один такой поиск, например 'purple king', где «фиолетовый» - это бригада, а «король» - это идентификатор, а также карты с этими бригадами и идентификаторами. Этот ответ на аналогичный вопрос, https://stackoverflow.com/a/9951200/633513, показал, как вы можете использовать полнотекстовый поиск по нескольким таблицам. Я хотел бы сделать то же самое, за исключением того, что мне просто нужны соответствующие матчи. Это возможно?релевантность поиска по нескольким связанным таблицам

Таблица структуры:

Cards: id as INT, title as VARCHAR(50) 
Brigades: id as INT, brigade as VARCHAR(50) 
Identifier: id as INT, identifier as VARCHAR(50) 

Регистрация Таблицы:

CardBrigades: id as INT, card_id as INT, brigade_id as INT 
CardIdentifiers: id as INT, card_id as INT, identifier_id as INT 

Примеры Идентификаторы:

Angel 
Animal 
Archer 
Army 
Assyrian 
Babylonian 
Based on Prophecy 
Beast 
Bows, Arrows, Spears, Javelins and Darts 
Canaanite 
'Capture' in Special Ability 
'Censer' in Title 
Chief Priest 
Child of Leah 
Commander 
Connected to David 
Connected to Demons 
'Covenant' in Title 
'David' in Title 
'David' in Verse 
Deacon 
Prince 

Примеры Бригады:

None 
Black 
Brown 
Crimson 
Gold (Evil) 
Gray 
Orange 
Pale Green 
Multi (Evil) 
Blue 
Gold (Good) 
Green 
Purple 
Red 
Silver 
Teal 
White 
Multi (Good) 
Multi 
+0

Эта структура таблицы фактически не показывает отношения. Имеются ли в карточках столбцы для значений Brigades.id и Identifier.id? Или Бридгадес имеет ценность Card.id? Что-то кажется неправильным. – Ilion

+0

Можете ли вы предоставить некоторые данные образца? Поля VARCHAR включают только «фиолетовый» и т. Д., Или они также могут включать «фиолетовое сердце», которое вы также хотите сопоставить. – liquorvicar

+0

@Ilion извините, я забыл о столах объединения. Я обновил вопрос с ними. – LordZardeck

ответ

1

На основании ответа в ссылке, которую вы публикуемыми вы могли бы сделать что-то вроде этого

SELECT id,SUM(relevance) as total_relevance FROM (
SELECT 
    id, 
    (MATCH(title) AGAINST ('search string')) AS relevance 
    FROM Cards 
UNION 
SELECT 
    Cards.id, 
    (MATCH(brigade) AGAINST ('search string')) AS relevance 
    FROM Brigades 
    INNER JOIN CardBrigades ON Brigades.id=brigade_id 
    INNER JOIN Cards ON card_id=Cards.id 
UNION 
SELECT 
    Cards.id, 
    (MATCH(identifier) AGAINST ('search string')) AS relevance 
    FROM Identifier 
    INNER JOIN CardIdentifier ON Identifier.id=identifier_id 
    INNER JOIN Cards on card_id=Cards.id 
) AS combined_search 
GROUP BY id 
HAVING total_relevance > 0 

Я не уверен, насколько хорошо это будет выполнять. Возможно, вам лучше взглянуть на другое решение, такое как Solr, Lucene или даже механизм хранения NoSQL.

+0

Я смог получить это, но как найти тот, который связан? Например, поиск с использованием этого запроса дал бы мне короли, которые не фиолетовые – LordZardeck

+0

@LordZardeck Я не уверен, что вы можете достичь того, чего хотите в MySQL. Возможно, вам лучше использовать специализированную строковую поисковую систему. – liquorvicar

+0

как узнать количество обращений на один идентификатор карты? то вы можете заказать, сколько хитов найти подходящее право mos? – LordZardeck

0

Если вы просто хотите, связанный с ним (отношение?) Результаты, которые вы можете использовать полнотекстовый поиск в BOOLEAN MODE следующим образом:

select 
    identifier, brigade, P.id as identifier_id, B.id as brigade_id, 
    match(identifier) against ('purple prince') + 
    match(brigade)  against ('purple prince') as score 
from Identifier P, Brigade B 
where 
    match(identifier) against ('purple prince' IN BOOLEAN MODE) and 
    match(brigade)  against ('purple prince' IN BOOLEAN MODE) 
order by -score 
; 

(Для того, чтобы сделать его простым, я просто показать результаты поиска FULLTEXT часть запроса и опустить соединение с таблицей Card *)

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