2016-03-02 128 views
0

我正在構建一個查詢來搜索數據庫行中幾個字段中的關鍵字,我想知道的是如果有任何方法返回的結果是在該領域在查詢中返回與WHERE子句匹配的WHERE子句的列名稱

例如,像一個查詢:

SELECT * 
FROM table 
WHERE field1 LIKE "%keyword%" 
    OR field2 LIKE "%keyword%" 
    OR field3 LIKE "%keyword%" 

如果關鍵字出現在field2我想返回的行以及其他信息標識,這是發現在field2。這可能嗎?

+0

沒有直接關係,但您可能對FULLTEXT搜索感興趣 – Mihai

回答

1

但請注意,如果匹配多個字段只會返回第一個。

SELECT *, 
     CASE WHEN field1 LIKE "%keyword%" THEN 'field1' 
      WHEN field2 LIKE "%keyword%" THEN 'field2' 
      WHEN field3 LIKE "%keyword%" THEN 'field3' 
      ELSE 'no-match' 
     END as matchField 
FROM table 
WHERE field1 LIKE "%keyword%" 
    OR field2 LIKE "%keyword%" 
    OR field3 LIKE "%keyword%" 
3

您可以添加一些列指示哪些字段(S)相匹配的where條款。沒有辦法在不將它放入select的情況下提取這些信息。

SELECT 
    *, 
    case when field1 LIKE "%keyword%" then 1 else 0 end as field1_found, 
    case when field2 LIKE "%keyword%" then 1 else 0 end as field2_found, 
    case when field3 LIKE "%keyword%" then 1 else 0 end as field3_found, 
FROM table 
WHERE field1 LIKE "%keyword%" 
    OR field2 LIKE "%keyword%" 
    OR field3 LIKE "%keyword%" 
1

一個非常簡單的方法是這樣的:

SELECT 'field1', * 
FROM table 
WHERE field1 LIKE "%keyword%" 
UNION 
SELECT 'field2', * 
FROM table 
WHERE field2 LIKE "%keyword%" 
UNION 
SELECT 'field3', * 
FROM table 
WHERE field3 LIKE "%keyword%" 
+0

我同意,這也是我的第一個想法。但是,這不是全表掃描三次嗎?我不確定,但我是這麼認爲的。 – PerlDuck

+0

@PerlDog我也這麼認爲(即使它可能會被某些引擎優化,但我不確定)。所以根據上下文的不同,選擇幾乎是非常重要的:我建議的解決方案具有簡單性的優點,但只有在記錄數量不是很多的情況下才是最好的解決方案。 – cFreed

+0

再次,我同意。這取決於實際的表格。我喜歡它,因爲它很簡單。 – PerlDuck

1

一種方法是一起將它們連接起來:

SELECT t.*, 
     concat_ws(',', 
       (case when field1 LIKE '%keyword%' then 'field1' end), 
       (case when field2 LIKE '%keyword%' then 'field2' end), 
       (case when field3 LIKE '%keyword%' then 'field3' end) 
       ) as matchingFields 
FROM table 
WHERE field1 LIKE '%keyword%' OR 
     field2 LIKE '%keyword%' OR 
     field3 LIKE '%keyword%'; 

注:這是使用(ANSI標準是個好主意)字符串常量的單引號。

1

你也可以在一個領域做到這一點。

MariaDB []> SELECT 
    -> concat_ws(', ', 
    ->  IF(field1 LIKE '%keyword%','field1',NULL), 
    ->  IF(field2 LIKE '%keyword%','field2',NULL), 
    ->  IF(field3 LIKE '%keyword%','field3',NULL) 
    -> ) AS found_in, s.* 
    -> FROM searchtable s 
    -> WHERE field1 LIKE '%keyword%' 
    -> OR field1 LIKE '%keyword%' 
    -> OR field1 LIKE '%keyword%'; 
+------------------------+----+---------+---------+---------+ 
| found_in    | id | field1 | field2 | field3 | 
+------------------------+----+---------+---------+---------+ 
| field1     | 1 | keyword | NULL | NULL | 
| field1, field3   | 4 | keyword | NULL | keyword | 
| field1, field2   | 6 | keyword | keyword | NULL | 
| field1, field2, field3 | 7 | keyword | keyword | keyword | 
+------------------------+----+---------+---------+---------+ 
4 rows in set (0.01 sec) 

MariaDB []>