Counting word occurrences in a table column

前端 未结 5 1518
渐次进展
渐次进展 2020-12-11 19:13

I have a table with a varchar(255) field. I want to get (via a query, function, or SP) the number of occurences of each word in a group of rows from this table.

If

相关标签:
5条回答
  • 2020-12-11 20:01

    You can try this perverted-a-little way:

    SELECT 
    (LENGTH(field) - LENGTH(REPLACE(field, 'word', ''))) / LENGTH('word') AS `count`
    ORDER BY `count` DESC
    

    This query can be very slow. Also, it looks pretty ugly.

    0 讨论(0)
  • 2020-12-11 20:02

    I think you should do it like indexing, with additional table. Whenever u create, update, or delete a row in your original table, you should update your indexing table. That indexing table should have the columns: word, and the number of occurrences.

    0 讨论(0)
  • 2020-12-11 20:07

    I would recommend not to do this in SQL at all. You're loading DB with something that it isn't best at. Selecting a group of rows and doing frequency calculation on the application side will be easier to implement, will work faster and will be maintained with less issues/headaches.

    0 讨论(0)
  • 2020-12-11 20:13

    I think you are trying to do too much with SQL if all the words are in one field of each row. I recommend to do any text processing/counting with your application after you grab the text fields from the db.

    0 讨论(0)
  • 2020-12-11 20:16

    @Elad Meidar, I like your question and I found a solution:

    SELECT SUM(total_count) as total, value
    FROM (
    
    SELECT count(*) AS total_count, REPLACE(REPLACE(REPLACE(x.value,'?',''),'.',''),'!','') as value
    FROM (
    SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(t.sentence, ' ', n.n), ' ', -1) value
      FROM table_name t CROSS JOIN 
    (
       SELECT a.N + b.N * 10 + 1 n
         FROM 
        (SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) a
       ,(SELECT 0 AS N UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) b
        ORDER BY n
    ) n
     WHERE n.n <= 1 + (LENGTH(t.sentence) - LENGTH(REPLACE(t.sentence, ' ', '')))
     ORDER BY value
    
    ) AS x
    GROUP BY x.value
    
    ) AS y
    GROUP BY value
    

    Here is the full working fiddle: http://sqlfiddle.com/#!2/17481a/1

    First we do a query to extract all words as explained here by @peterm(follow his instructions if you want to customize the total number of words processed). Then we convert that into a sub-query and then we COUNT and GROUP BY the value of each word, and then make another query on top of that to GROUP BY not grouped words cases where accompanied signs might be present. ie: hello = hello! with a REPLACE

    0 讨论(0)
提交回复
热议问题