Ich habe ein System, das SERPs sammelt (Suchmaschinenergebnisse) und speichert sie in der Datenbank. Ich benutze MS SQL 2008 R2.SQL finde alle Gruppen mit mindestens N passenden Elementen
Für jedes angegebene Schlüsselwort gibt es eine SERP-Ergebnisgruppe, die 10 SERP-Elemente enthält.
Keyword ->
SERP Group ->
- SERP item
- SERP item
- ... (3-10)
Entities
public class SerpResultsGroup
{
public SerpResultsGroup()
{
SerpResults = new List<SerpResult>();
}
public int Id { get; set; }
public int KeywordId { get; set; }
public Keyword Keyword { get; set; }
public ICollection<SerpResult> SerpResults { get; set; }
}
public class SerpResult
{
public int Id { get; set; }
public int Position { get; set; }
public string Url { get; set; }
public int SerpResultsGroupId { get; set; }
public SerpResultsGroup SerpResultsGroup { get; set; }
}
DB-Schema pic
Jetzt muss ich alle SERP-Gruppen (oder SERP Artikel) kombinieren und solche Gruppen zu finden, wo mindestens N (3) SERP-Artikel sind identisch.
Hier ist ein Bild zur Veranschaulichung der Logik. Grouping algorithm, illustration. Das Bild zeigt, wie verwandte Gruppen übereinstimmen. Der Einfachheit halber gibt es nur 3 Gruppen im Bild, aber in Wirklichkeit könnte es N Gruppen von SERP-Elementen in der Datenbank geben.
Say i eine Gruppe/keyword (group = Schlüsselwort) haben, und ich will alle passenden Gruppen finden, die von einer gegebenen Gruppe mit URLs mindestens 3 (N) haben, übereinstimmt. Diese Gruppen sollten außerdem mindestens 3 (N) passende URLs haben.
Gleiche Kriterien, aber jetzt haben wir eine Startgruppe nicht und wir wollen Gruppe alle Gruppen gegeneinander an.
Wie könnte ich diese Aufgabe erreichen? Muss ich CROSS JOIN verwenden?
aktualisiert
folgende Abfrage scheint mit der ID 11, die eine Reihe von passenden Gruppen für eine bestimmte Gruppe zurückzukehren, aber es überprüft nicht, dass jede Gruppe von zurück Satz gegeneinander abgestimmt ist.
SELECT sr.SerpResultsGroupId, sr1.SerpResultsGroupId
FROM SerpResults sr
INNER JOIN SerpResults sr1 ON sr.Url = sr1.Url
WHERE sr.SerpResultsGroupId != sr1.SerpResultsGroupId
AND sr.SerpResultsGroupId = 11
GROUP BY sr.SerpResultsGroupId, sr1.SerpResultsGroupId
HAVING COUNT(sr1.SerpResultsGroupId) >= 3
Ihre Darstellung macht keinen Sinn (zumindest für mich). Bearbeiten Sie Ihre Frage und fügen Sie Beispieldaten und gewünschte Ergebnisse in die Frage ein. –
** (1) ** Welche Datenbank benutzen Sie? ** (2) ** Wie soll das Ergebnis aussehen? –
@GordonLinoff, ich habe die Frage aktualisiert.Sieht es besser aus? –