2016-09-04 2 views
0

Рассмотрим следующую таблицу MySQLКак найти значения столбцов, присутствующие в данном предложении? MySQL

id   name 
-----  ------ 
1   Mark 
2   Mike 
3   Paul 
4   John 

И рассмотрим на вход приговорить

Mark and Paul are very good friends since 2000. 

Ожидаемый выходной

Mark , Paul 

Я хочу, чтобы найти имена, присутствующие во входном предложении. Имеет ли mysql любые параметры, чтобы найти это. Или какие-нибудь идеи?

+0

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

ответ

1

Это может быть достигнуто двумя способами. Используя оператор «IN» и «REGEX» mysql.

С помощью 'в' Оператор

<?php 

$string = "Mark and Paul are very good friends since 2000."; 
$sql_in = "'".implode("','",explode(" ",$string))."'"; 

//Will return all the records for which name match with any word in given sentence. 
$mysql_query = "select * from table_name where name in($sql_in)"; 

?> 

Используя 'Regex'

<?php 

$string = "Mark and Paul are very good friends since 2000."; 
$regex_string = str_replace(' ','|',$string); 

//Will return all the records for which name match with any word in given sentence. 
$mysql_query = "select * from table_name where name REGEX '^(".$regex_string.")'"; 

?> 
+0

Хорошо, это хорошая идея. Это единственный способ решить эту проблему? Избежать этот запрос немного дорого, может потребоваться много времени для выполнения. –

+0

Я думаю, вы должны сделать это с помощью REGEX, но не уверены. –

+0

Хорошо. Давайте посмотрим на идеи других людей. –

0

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

$sentence = "Mark and Paul are very good friends since 2000." 

//some code to get all names from the database 
//simulation mysql-output as array 
$names = array("Mark", "Mike", "Paul", "John"); 

//first split the String into a array what contains all words of the sentences 
$array = explode(" ", $sentence); 

//now you can check if any words in the array eqauls a name in your database 
//create a foreach loop to check all words 
foreach($array as $word) { 

    //search if the word contains in the array 
    if(in_array($word, $names)) { 
     //this word is a searched name 
     print_r("Word ".$word." is a name!\n"); 
    } 
    else { 
     //this word isn't a name 
    } 
} 

В случае If/Else вы можете закодировать обработчик custum. Обратите внимание, если предложение заканчивается точкой, которую последнее слово имеет в последнем знаке точку (.). Вы можете проверить его и удалить точку с помощью функции substr.

Я не тестирую код.

0

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

CREATE PROCEDURE FindInDB 
    @INSTR varchar(255) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @SEPERATOR as VARCHAR(1) 
    DECLARE @SP INT 
    DECLARE @VALUE VARCHAR(1000) 
    SET @SEPERATOR = ' ' 

    -- Create Temporary table add all words in it 
    CREATE TABLE #tempTab (name varchar(50) not null) 
    WHILE PATINDEX('%' + @SEPERATOR + '%', @INSTR) <> 0 

    BEGIN 
     SELECT @SP = PATINDEX('%' + @SEPERATOR + '%',@INSTR) 
     SELECT @VALUE = LEFT(@INSTR , @SP - 1) 
     SELECT @INSTR = STUFF(@INSTR, 1, @SP, '') 
     INSERT INTO #tempTab (name) VALUES (@VALUE) 
    END 

    -- Total execution time 15  0  7.5000 

--SELECT [Name] 
--FROM [tblName] 
--where Name IN (SELECT name FROM #tempTab) 

--Total execution time 15  15  0  10.0000 

--SELECT distinct [tblName].[Name] 
--FROM [tblName] 
--inner join #tempTab on #tempTab.name = tblName.Name; 

--Total execution time 15  15  15  15  0  12.0000 

SELECT [Name] 
FROM [tblName] 
where EXISTS (SELECT name FROM #tempTab 
where #tempTab.name = tblName.Name) 

DROP TABLE #tempTab 
END 
GO 
Смежные вопросы