【问题标题】:Get number of times keyword is present获取关键字出现的次数
【发布时间】:2013-12-29 19:57:24
【问题描述】:

假设我有以下数据,最后一列关键字不过是其他 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。我做错了什么?

【问题讨论】:

  • +1 用于酷炫的 ASCII 艺术表
  • 那是因为你的内部查询丢失了计数,只选择了IDs。

标签: sql sql-server


【解决方案1】:

... 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

【讨论】:

    【解决方案2】:

    为什么不做一个没有子查询的简化版本:

    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
    

    'Order by 6'表示选择范围内的第六个元素,即频率

    【讨论】:

    • @DanielE。你是对的,我再次阅读了 OP 的问题并更好地理解了它。我会改正的。
    【解决方案3】:
    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多