获取关键字出现的次数

时间:2013-12-11 17:31:47

标签: sql sql-server

假设我有以下数据,最后一列关键字只是其他4个列的组合。

╔════╦══════╦════════════╦═════════╦════════════╦════════════════════════════════╗
║ ID ║ Name ║    Add1    ║  Add2   ║    Add3    ║            Keyword             ║
╠════╬══════╬════════════╬═════════╬════════════╬════════════════════════════════╣
║  1 ║ John ║ W Brown St ║ Edison  ║ Washington ║ JohnW Brown StEdisonWashington ║
║  2 ║ Paul ║ E High Rd  ║ Peapack ║ New Jersey ║ PaulE High RdPeapackNew Jersey ║
║  3 ║ John ║ Greams Rd  ║ Peapack ║ Washington ║ JohnGreams RdPeapackWashington ║
╚════╩══════╩════════════╩═════════╩════════════╩════════════════════════════════╝

现在,用户可以输入任意文本字段Name,Add1,Add2,Add3并单击搜索,它应该搜索所有字段。

为此,我正在尝试这个,

SELECT *, COUNT(ID) AS FREQUENCY FROM TABA WHERE ID IN
(
 (SELECT ID FROM TABA WHERE KEYWORD LIKE '%WASHINGTON%')
 UNION ALL
 (SELECT ID FROM TABA WHERE KEYWORD LIKE '%JOHN%')
 UNION ALL
 (SELECT ID FROM TABA WHERE KEYWORD LIKE '%PEAPACK%')
)
GROUP BY ID
ORDER BY FREQUENCY

预期产出:

╔════╦══════╦════════════╦═════════╦════════════╦═══════════╗
║ ID ║ Name ║    Add1    ║  Add2   ║    Add3    ║ Frequency ║
╠════╬══════╬════════════╬═════════╬════════════╬═══════════╣
║  3 ║ John ║ Greams Rd  ║ Peapack ║ Washington ║         3 ║
║  1 ║ John ║ W Brown St ║ Edison  ║ Washington ║         2 ║
║  2 ║ Paul ║ E High Rd  ║ Peapack ║ New Jersey ║         1 ║
╚════╩══════╩════════════╩═════════╩════════════╩═══════════╝

但我得到的所有频率值都是1.我做错了什么?

3 个答案:

答案 0 :(得分:3)

部分... WHERE ID IN ( ...) ...只会执行“是或否”检查,但您需要计算。这必须通过JOIN来完成。

试试这个:

SELECT TABA.*, COUNT(sub.ID) AS FREQUENCY FROM TABA JOIN 
(
 (SELECT ID FROM TABA WHERE KEYWORD LIKE '%WASHINGTON%')
 UNION ALL
 (SELECT ID FROM TABA WHERE KEYWORD LIKE '%JOHN%')
 UNION ALL
 (SELECT ID FROM TABA WHERE KEYWORD LIKE '%PEAPACK%')
) sub ON sub.ID=TABA.ID
GROUP BY TABA.ID
ORDER BY FREQUENCY

答案 1 :(得分:1)

为什么不在没有子查询的情况下进行简化版本:

SELECT  ID, Name, Add1, Add2, Add3, COUNT(*) AS FREQUENCY 
  FROM TABA 
 WHERE ID IN
     (SELECT ID 
        FROM TABA 
        WHERE KEYWORD LIKE '%WASHINGTON%'
           OR KEYWORD LIKE '%JOHN%'
           OR KEYWORD LIKE '%PEAPACK%')
GROUP BY ID, Name, Add1, Add2, Add3
ORDER BY 6

'按6排序'表示选择范围的第六个元素,即频率

答案 2 :(得分:0)

SELECT TABA.*, sub.FREQUENCY  
FROM
(
  SELECT ID, COUNT(*) as FREQUENCY
  FROM 
  (
   (SELECT ID FROM TABA WHERE KEYWORD LIKE '%WASHINGTON%')
   UNION ALL
   (SELECT ID FROM TABA WHERE KEYWORD LIKE '%JOHN%')
   UNION ALL
   (SELECT ID FROM TABA WHERE KEYWORD LIKE '%PEAPACK%')
  ) a
  GROUP BY ID
) sub 
INNER JOIN TABA ON sub.ID=TABA.ID
ORDER BY FREQUENCY DESC

sql fiddle