2009-06-18 17 views
0

ich eine Tabelle wie folgt aus:mysql query

col1 col2 

2001 3001 
2002 3001 
2003 3001 
2004 3002 
2002 3003 
2001 3003 

ich will es eine Abfrage erstellen, die alle zusammen mit einem bestimmten Element in col1 von Gegenständen in col1 findet heraus, wenn sie auf den gleichen Punkt kommen in col2 und die Häufigkeit des Auftretens. Zum Beispiel, wenn wir wollen, in COL1 die Abfrage Artikelnummer „2001“ erkunden zurückkehren sollte:

col3 col4 col5 
2001 2002 0.667 
2001 2003 0.333 

Kann mir jemand einen Tipp geben? Danke voraus.

+1

Das macht keinen Sinn Kannst du die Frage neu formulieren? –

+0

Sind Ihre col2 Daten im ersten Block korrekt? – northpole

+0

Die Beispieldaten und gewünschten Ergebnisse machen keinen Sinn - 2001 kommt im Beispiel doppelt in col1 vor, die entsprechenden col2-Werte sind jeweils 3001 und 3003 - keine Beziehung zur gewünschten Ausgabe. –

Antwort

1

Denken an es auf diese Weise, versuchen Sie die Tabelle mit sich selbst durch col2 zu beziehen, so dass wir mit einem Join auf sich selbst beginnen:

select left.col1, right.col1/*, ...*/ from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' /* ... */ 

Jetzt für Ihr Aggregat. Sie wollen alle right.col1 aggregieren die Zählung für diese Spalte zu erhalten:

select left.col1, right.col1, COUNT(*) from table left inner join table right on left.col2 = right.col2 where left.col1 = '2001' group by right.col2 

die ich glaube, mit den Rohzählungen kommen sollte. Ich glaube, du musst die Abfrage drehen und eine Summe erhalten, um die Häufigkeit zu erhalten.

Als eine Anmerkung, das wäre viel komplizierter, wenn col1 nicht konstant wäre.

Edited zu hinzufügen: Wenn Sie für eine Abfrage suchen, anstatt über sie Laufen in welcher Sprache auch immer Sie von Abfragen sind, müssen Sie diese zweimal Gruppierung tun:

SELECT abs_freq.col1, abs_freq.col2, abs_freq.freq/totals.total 
FROM (SELECT 
     left.col1 AS col1, 
     COUNT(*) AS total 
     FROM TABLE LEFT 
     INNER JOIN TABLE RIGHT 
     ON left.col2 = right.col2 
     WHERE left.col1 = '2001' 
     GROUP BY left.col1 
    ) totals 
INNER JOIN (SELECT 
       left.col1 AS col1, 
       right.col1 AS col2, 
       COUNT(*) AS freq 
      FROM TABLE LEFT 
      INNER JOIN TABLE RIGHT 
       ON left.col2 = right.col2 
      WHERE left.col1 = '2001' 
      GROUP BY right.col2 
      ) abs_freq 
    ON abs_freq.col1 = totals.col1 
+0

Könntest du mir näher erklären, wie man die Frequenz bekommt? –

+0

Das Ergebnis gibt drei Spalten zurück. Die dritte Spalte in der obigen Abfrage ist die Anzahl der Vorkommen in absoluten Zahlen, also hätten Sie 2002 -> 2 und 2003 -> 1. Um die Häufigkeit in der von Ihnen verwendeten Sprache zu erhalten, erhalten Sie die Summe (2 + 1), dann dividiere die Spalte durch die Summe (2002 -> 2/(2 + 1) = 0.667, 2003 -> 1/(2 + 1) = 0.333) –

+0

Ich benutze die folgende Abfrage: wähle C.tagid1, C .tagid2, C.partial * 1.0/Summe (C.partial) von (wählen Sie A.tagid tagid1, B.tagid tagid2, count (*) partiell von Haupt A innere Verbindung Haupt B auf A.itemid = B. Artikel-Nr. , wobei A.tagid! = B.tagid UND A.tagid = 2001 Gruppe von B.tagid) als C; jedoch gibt es nur eine Zeile wegen der Summenfunktion zurück. Hast du eine Idee, wie das zu beheben ist? –