Domanda

Ho un MSSQL 2005 tabella:

[Companies](
    [CompanyID] [int] IDENTITY(1,1) NOT NULL,
    [Title] [nvarchar](128),
    [Description] [nvarchar](256),
    [Keywords] [nvarchar](256)
)

Voglio generare una nuvola di tag per questa società.Ma ho salvato tutte le parole chiave in una colonna separata da virgole.Suggerimenti per generare tag cloud dalla maggior parte delle parole chiave utilizzate.Ci potrebbero essere milioni di aziende in circa dieci parole chiave per ogni azienda.

Grazie.

È stato utile?

Soluzione

Passaggio 1: separare le parole chiave in un giusto rapporto (tabella).

CREATE TABLE Keywords (KeywordID int IDENTITY(1,1) NOT NULL
  , Keyword NVARCHAR(256)
  , constraint KeywordsPK primary key (KeywordID)
  , constraint KeywordsUnique unique (Keyword));

Passaggio 2: Mappare la molti-a-molti relazione tra aziende e tag in una tabella separata, come tutti i molti-a-molti rapporti:

CREATE TABLE CompanyKeywords (
   CompanyID int not null
   , KeywordID int not null
   , constraint CompanyKeywords primary key (KeywordID, CompanyID)
   , constraint CompanyKeyword_FK_Companies
      foreign key (CompanyID)
      references Companies(CompanyID)
   , constraint CompanyKeyword_FK_Keywords
      foreign key (KeywordID)
      references Keywords (KeywordID));

Passaggio 3: Utilizzare una semplice query GROUP BY per generare la 'nuvola' (con l'esempio prendendo la 'nuvola' per significare le più comuni 100 tag):

with cte as (
SELECT TOP 100 KeywordID, count(*) as Count
FROM CompanyKeywords
group by KeywordID
order by count(*) desc)
select k.Keyword, c.Count
from cte c
join Keyword k on c.KeywordID = k.KeywordID;

Passo 4:. La cache il risultato come cambia raramente e calcola costoso

Altri suggerimenti

Preferirei mille volte vedere il vostro disegno normalizzati come suggerito da Remo , ma se siete in un punto in cui non è possibile modificare il vostro disegno ...

È possibile utilizzare una funzione di analisi (l'esempio userò è tratto da qui ), per analizzare le parole chiave e le considero.

CREATE FUNCTION [dbo].[fnParseStringTSQL] (@string NVARCHAR(MAX),@separator NCHAR(1))
RETURNS @parsedString TABLE (string NVARCHAR(MAX))
AS 
BEGIN
   DECLARE @position int
   SET @position = 1
   SET @string = @string + @separator
   WHILE charindex(@separator,@string,@position) <> 0
      BEGIN
         INSERT into @parsedString
         SELECT substring(@string, @position, charindex(@separator,@string,@position) - @position)
         SET @position = charindex(@separator,@string,@position) + 1
      END
     RETURN
END
go

create table MyTest (
    id int identity,
    keywords nvarchar(256)
)

insert into MyTest
    (keywords)
    select 'sql server,oracle,db2'
    union
    select 'sql server,oracle'
    union
    select 'sql server'

select k.string, COUNT(*) as count
    from MyTest mt
        cross apply dbo.fnParseStringTSQL(mt.keywords,',') k
    group by k.string
    order by count desc

drop function dbo.fnParseStringTSQL
drop table MyTest

Sia Remus e Joe sono corrette, ma sì come quello che Joe ha detto che se non avete una scelta, quindi devi vivere con esso.Penso di poter offrire una soluzione semplice, utilizzando il Tipo di Dati XML.È già possibile visualizzare facilmente analizzato colonna eseguendo questa query

WITH myCommonTblExp AS (
    SELECT CompanyID,
    CAST('<I>' + REPLACE(Keywords, ',', '</I><I>') + '</I>' AS XML) AS Keywords
    FROM Companies
)
SELECT CompanyID, RTRIM(LTRIM(ExtractedCompanyCode.X.value('.', 'VARCHAR(256)'))) AS Keywords
FROM myCommonTblExp
CROSS APPLY Keywords.nodes('//I') ExtractedCompanyCode(X)

ora, sapendo che si può fare, tutto quello che dovete fare è quello di raggruppare e contare, ma non è possibile raggruppare i metodi XML, quindi il mio consiglio è di creare una visualizzazione della query di cui sopra

CREATE VIEW [dbo].[DissectedKeywords]
AS
WITH myCommonTblExp AS (
    SELECT 
    CAST('<I>' + REPLACE(Keywords, ',', '</I><I>') + '</I>' AS XML) AS Keywords
    FROM Companies
)
SELECT RTRIM(LTRIM(ExtractedCompanyCode.X.value('.', 'VARCHAR(256)'))) AS Keywords
FROM myCommonTblExp
CROSS APPLY Keywords.nodes('//I') ExtractedCompanyCode(X)
GO

eseguire le vostre contare sulla vista

SELECT Keywords, COUNT(*) AS KeyWordCount FROM DissectedKeywords
GROUP BY Keywords
ORDER BY Keywords

Comunque ecco l'articolo completo -->http://anyrest.wordpress.com/2010/08/13/converting-parsing-delimited-string-column-in-sql-to-rows/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top