как найти сайты с помощью поиска по тегам? - PullRequest
0 голосов
/ 06 февраля 2011

У меня есть следующая таблица tags:

web           | tags
------------------------------------------------------------
google.com    | search,google,searchengine,engine,web 
facebook.com  | facebook,social,networking,friends 
youtube.com   | video,youtube,videos,entertainment 
yahoo.com     | yahoo,search,email,news,searchengine
bing.com      | search,searchengine,microsoft,bing,tools

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

Если, например,какой-то один поиск по google.com, тогда я хочу перечислить yahoo и bing из приведенной выше таблицы примеров.

Как этого добиться с помощью PHP и MySQL?(Я включил FULL TEXT SEARCH для этой таблицы)

Ответы [ 2 ]

2 голосов
/ 06 февраля 2011

Нечто подобное может дать вам желаемые результаты, но это будет довольно медленно. Может быть, кто-то еще может предложить более эффективное решение:

SELECT t1.* FROM tags AS t1 JOIN tags AS t2
  ON LIST_INTERSECT(t1.tags, t2.tags) != ''
  WHERE t1.web='google.com'

И вам также понадобится эта сохраненная функция (просто скопируйте и вставьте этот код в клиент mysql после подключения к серверу и выбора базы данных):

DELIMITER $$
CREATE FUNCTION LIST_INTERSECT(
    list1 VARCHAR(255), list2 VARCHAR(255)
) RETURNS VARCHAR(255)
BEGIN
    SET @delim = ',';
    SET @list = list1;
    SET @overlap = '';
    LOOPING: LOOP
        IF (LOCATE(@delim, @list) > 0) THEN
            SET @word = SUBSTRING_INDEX(@list, @delim, 1);
            SET @list = SUBSTR(@list, LOCATE(@delim, @list) + 1);
        ELSE
            SET @word = @list;
            SET @list = NULL;
        END IF;
        IF (CONCAT(',',list2,',') LIKE CONCAT('%,',@word,',%')) THEN
            SET @newword = @word;
            IF (@overlap != '') THEN
                SET @newword = CONCAT(',', @word);
            END IF;
            SET @overlap = CONCAT(@overlap, @newword);
        END IF;
        IF (@list IS NULL) THEN
            LEAVE LOOPING;
        END IF;
    END LOOP LOOPING;
    RETURN @overlap;
END$$
DELIMITER ;

(Команда DELIMITER предназначена для изменения разделителя оператора с ";" на "$$" и обратно. Это необходимо сделать для определения пользовательских функций или процедур .)

По сути, этот код ищет сайт в столбце web, затем он находит все другие сайты, которые имеют общие ключевые слова в столбце tags. Используя это, если вы ищете «google.com», он также вернет «bing.com» и «yahoo.com», потому что все три из этих записей имеют «search» и «searchengine» в tags.

0 голосов
/ 06 февраля 2011

Разве невозможно иметь как веб-таблицу, так и таблицу тегов с таблицей, связывающей их вместе?

Если ваша структура действительно не может измениться, то будет работать что-то вроде SELECT * FROM web WHERE tags LIKE '%google%'.

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