2014-03-29 22 views
0

例如:我有一個包含5個字段的表,名爲id,field_1,field_2,field_3,field_4 而且我正在搜索'foo'領域。返回找到搜索字詞的列名稱,使用PHP

SELECT ID FROM table WHERE field_1 LIKE ('%foo%') OR field_2 LIKE ('%foo%') OR ... 

我想返回的ID,以及該領域的術語中被發現。

什麼是做到這一點的最有效方法是什麼?

注:我正在尋找一個解決方案,可以動態適應添加新的數據庫字段,而無需手動更新SQL。

+1

如果字符串在多個字段中找到,會發生什麼? – TheWolf

+0

@TheWolf - 它會顯示每個領域的發生,理想情況。 – drpudding

回答

2

一種可能的方法是將這些比賽在返回的列映射:

SELECT ID, 
     field_1 LIKE '%foo%' AS field_1_match, 
     field_2 LIKE '%foo%' AS field_2_match 
... 

...所以你可以檢查每一個對應column_match值就知道了,好了,是它匹配與否。

人們很容易將它與CONCAT_WS延伸到返回與列的字符串(由,分隔,例如):

SELECT ID, 
     CONCAT_WS(',', 
     IF(field_1 LIKE '%foo%', 'field_1', NULL), 
     IF(field_2 LIKE '%foo%', 'field_2', NULL) 
     ... 
     ) 

...但是,老實說,我懷疑這會更容易處理數據以這種方式格式化。

+0

我看到這是如何工作的少數固定字段,但希望找到一些動態的,這樣它可以容納新的字段被添加,而無需手動更新SQL。我會將其添加到我原來的帖子中。 – drpudding

0

使用工會:

SELECT id, 'field_1' as 'fieldName' FROM table WHERE field1 LIKE '%foo%' UNION 
SELECT id, 'field_2' as 'fieldName' FROM table WHERE field2 LIKE '%foo%' UNION 
... 

這將返回的地方發現它的ID和列名。如果它在同一行發生多次,則會爲該行返回多個結果。

更新:

,能夠使用存儲的過程和一個光標動態搜索所有的表。

DELIMITER // 

CREATE PROCEDURE search_all_fields(IN search VARCHAR(100), IN tableName VARCHAR(100), IN idColumnName VARCHAR(100)) 
BEGIN 

    DECLARE sqlQuery VARCHAR(200); 
    DECLARE done INT DEFAULT 0; 
    DECLARE columnName VARCHAR(30); 
    DECLARE cur CURSOR FOR SELECT `COLUMN_NAME` FROM `INFORMATION_SCHEMA`.`COLUMNS` WHERE `TABLE_NAME`= tableName; # cursor will iterate over the column names 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1; 
    CREATE TEMPORARY TABLE temp (id VARCHAR(100), FieldName VARCHAR(100)); # procedure returns multiple result sets, so we'll dump them in a temp table and get them at the end 
    OPEN cur; 

    read_loop: LOOP # iterates through column names 
     FETCH cur INTO columnName; 
     IF done THEN 
      LEAVE read_loop; 
     END IF; 

     # execute search 
     SET @sqlQuery = CONCAT("INSERT INTO temp SELECT ", idColumnName, ", '", columnName, "' as 'FieldName' FROM ", tableName, " WHERE ", columnName, " LIKE '%", search, "%'"); 
     PREPARE stmt FROM @sqlQuery; 
     EXECUTE stmt; 
    END LOOP; 

    CLOSE cur; 
    # grab the results 
    SELECT * FROM temp; 
END;// 

DELIMITER ; 
+0

這需要我消化一下。謝謝。 – drpudding