Frage

Ich habe eine MSSQL 2005 Tabelle:

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

Ich mag einen Tag-Cloud für diese Unternehmen generieren. Aber ich habe alle Keywords in einer Spalte durch Komma getrennt gespeichert. Irgendwelche Vorschläge, wie Tag-Cloud von den meisten verwendeten Schlüsselwörter zu erzeugen. Es könnte Millionen von Unternehmen ca. zehn Keywords pro Unternehmen sein.

Danke.

War es hilfreich?

Lösung

Schritt 1: Trennen Sie die Schlüsselwörter in eine richtige Beziehung (Tabelle).

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

Schritt 2: Karte des many-to-many-Beziehung zwischen Unternehmen und Tags in eine separate Tabelle, wie alle many-to-many-Beziehungen:

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));

3. Schritt: Verwenden einer einfachen GROUP BY-Abfrage der ‚Wolke‘ (von Beispiel genommen wird, die ‚Wolke‘, die am häufigsten 100 Tags bedeuten) zu erzeugen:

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;

Schritt 4:. Cache das Ergebnis, wie es ändert sich nur selten und es berechnet teuer

Andere Tipps

Ich würde viel lieber sehen, Ihr Design als normalisiert von Remus vorgeschlagen , aber wenn man an einem Punkt, wo Sie nicht Ihr Design ändern können ...

Sie können eine Parsing-Funktion verwenden (das Beispiel, das ich genommen verwenden werden von hier ), um Ihre Keywords zu analysieren und sie zählen.

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

Sowohl Remus und Joe sind korrekt, aber ja wie das, was Joe sagte, wenn Sie die Wahl nicht haben, dann haben Sie mit ihm zu leben. Ich glaube, ich kann Ihnen eine einfache Lösung bieten, indem ein XML-Datentyp verwendet wird. Sie können bereits sehen leicht die geparsten Spalte, indem Sie diese Abfrage

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)

jetzt zu wissen, dass Sie das tun können, was Sie tun müssen, ist, sie zu gruppieren und zählen, aber Sie können nicht Gruppe von XML-Methoden so mein Vorschlag ist, einen Blick auf die Abfrage über

erstellen
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

und führen Sie Ihre Zählung auf dieser Ansicht

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

Sowieso ist hier die ganzen Artikel -> http://anyrest.wordpress.com/2010/08/13/converting-parsing-delimited-string-column-in-sql-to-rows/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top