我正在构建一个查询来搜索数据库行中几个字段中的关键字,我想知道的是有没有办法返回结果所在的字段。
例如,使用如下查询:
SELECT *
FROM table
WHERE field1 LIKE "%keyword%"
OR field2 LIKE "%keyword%"
OR field3 LIKE "%keyword%"
如果关键字显示在field2
中,我想返回该行以及标识在field2
中找到该行的其他信息。这可能吗?
答案 0 :(得分:3)
您可以添加一些列以指示哪个字段与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 :(得分: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%"
答案 2 :(得分: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%"
答案 3 :(得分: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标准)单引号是个好主意。
答案 4 :(得分: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 []>