Упрощенный поиск SQL - PullRequest
       8

Упрощенный поиск SQL

0 голосов
/ 01 сентября 2011

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

пример:

Таблица: item_data строка 1:

item_id = 1 (event)
Tags = "Rugby, Tickets, Give away, Sesssions, Prizes"

строка 2:

item_id = 2 (Ticket booking)
Tags = "New Zeland, Travel, Booking, Tickets, Rugby"

строка 3:

item_id = 3 (car for sale)
Tags = "New Zeland, Blue, Ford, Sedan"

существует исключительно в SQL, чтобы получить все соответствующие item_ids для данного набора тегов. взять данные тегов из строки 1 и найти все соответствующие записи для каждого тега во всех других строках?

Я могу сделать это с помощью смеси php и mysql, мне было интересно, есть ли у кого-нибудь лучший способ сделать это только на SQL.

Ответы [ 2 ]

1 голос
/ 01 сентября 2011

Я бы рекомендовал использовать нормализацию данных (http://www.bkent.net/Doc/simple5.htm)., если вы храните теги в строковых форматах, таких как «тег a, тег b, тег c и т. Д.», Тогда вам нужно выбрать каждый тег в БД, разбить их намассивы и сопоставьте их, чтобы найти релевантные данные.

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

|Item_table               |
|-------------------------|
|item_id | Desc           |
|1       | Event          |
|2       | Ticket Booking |
|-------------------------|

|Tag_Table   |
|------------|
|id  | tag   |
|1   | Rugby |
|2   | Blue  |

|Tag_Map                  |
|-------------------------|
|id    | tag id | item id |
|1     | 1      | 1       |
|2     | 1      | 2       |

Вы должны создать индекс в таблице карт и таблице тегов.так:

SELECT it.Desc FROM Item_Table it, Tag_Table tt, Tag_Map tm WHERE tt.id = tm.tag_id AND it.item_id = tm.item_id and (tt.tag = "Rugby" or tt.tag = "Blue");

вам нужно будет только изменить последнюю часть в () на один тег или продолжать добавлять «или» и другой тег, который даст вам все описания элементов, соответствующие любому данному тегу.

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

0 голосов
/ 01 сентября 2011
SELECT * FROM TABLE WHERE `Tags` LIKE %Rugby% OR `Tags` LIKE %New Zeland% OR .....

покажет вам все строки, которые имеют 'Rugby' или 'New Zeland' или ... в Tag.

Вы можете создать хранимую процедуру и передать свой поиск по тегамЭто.В процедуре создайте правильный SQL QUERY.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...