2016-04-03 16 views
0

Ich habe die folgende Tabelle mit dem Namen suchen, und ich möchte die Nummer der SessionID mit Namen mit "/ topic" und "/ detail" zurückgeben. Daher sollte es in meinem Fall 1 zurückgeben, da nur SessionID = 1 sowohl "/ topic" als auch "/ detail" in der Spalte "name" hat. enter image description hereSQL select Probleme

Ich habe versucht, den folgenden Code zu verwenden, aber ich denke, ich vermasselt wieder GROUP BY.

Thx!

  Select count(distinct `SessionID`) 
     from Find 
     where `name` like "/detail%" 
      and `name` like "/topic%" 
     group by `SessionID`, `date` 
     order by `date`; 

Ich habe auch eine andere Spalte namens "Datum", die nicht in meinem Screenshot angezeigt wurde. Das Spaltendatum gibt an, an welchem ​​Datum die SessionID gesammelt wurde. Also dachte ich, ich könnte nach SessionID für meinen oben erwähnten Zweck gruppieren und dann nach Datum gruppieren. Daher werde ich am Ende die Anzahl der SessionID-Meetinganforderungen von jedem Tag kennen.

+0

1. Ist der Name Ihrer Tabelle über 'Tabelle' in der DB? 2. Sehen Sie sich Ihre 'name' Filterkriterien in der' WHERE' Klausel an; Du hast einen Tippfehler. Du suchst nicht nach "/ Thema". 3. Warum müssen Sie nach Datum und Uhrzeit sortieren? Sind Sie sicher, dass die Gruppe bis zum Datum benötigt wird? –

+0

Was bedeutet die Datumsspalte? Bezieht es sich auf die SessionID? – maxvv

+0

Ja, es bezieht sich auf sessionID, es gibt das Datum der SessionID an. Sagen Sie "april1" für sessionID = 1,2 und "april2" für sessionID = 3 –

Antwort

1

Sie müssen Ihre Abfrage in 2 Schritten trennen. Zuerst müssen Sie die Sitzungen herausfinden, die sowohl /details% als auch /topic% enthalten. Dann kannst du sie zählen.

Pivot Zeilen für Namenssuche

SELECT 
    SessionID, 
    MAX(CASE WHEN name LIKE "/detail%" THEN 1 END) AS hasDetail, 
    MAX(CASE WHEN name LIKE "/topic%" THEN 1 END) AS hasTopic 
FROM Find 
GROUP BY SessionID 

Das Ergebnis der Unterabfrage ist:

SessionID hasDetail hasTopic 
--------- --------- -------- 
1   1   1 
2      1 
3   1   

das Ergebnis Graf

SELECT COUNT(*) 
FROM 
(
    SELECT 
     SessionID, 
     MAX(CASE WHEN `name` LIKE "/detail%" THEN 1 END) AS hasDetail, 
     MAX(CASE WHEN `name` LIKE "/topic%" THEN 1 END) AS hasTopic 
    FROM Find 
    GROUP BY SessionID 
) AS A 
WHERE A.hasDetail = 1 AND A.hasTopic = 1; 

Diese Abfrage geschrieben wird für MySQL-Datenbank ase, bitte lassen Sie mich wissen, wenn Sie andere SQL-Anweisung, wie T-SQL für SQL Server benötigen.

+0

thx für die gründliche Erklärung! –

+0

m mit mysql Werkbank jetzt, ich testete ur-Code und es funktionierte einwandfrei. –

+0

Gern geschehen! Happy Codierung;) @yingnanliu –

0

Sie waren in der Nähe, Sie mussten nur Datum und die Anzahl als verschiedene Spalten enthalten. Wie folgt:

 Select `SessionID`, `date`, count(*) as number 
    from Find 
    where `name` like "/detail%" 
     or `name` like "/topic%" 
    group by `SessionID`, `date` 
    order by `date`; 
+1

Ich bin überrascht. Dies funktioniert nicht, da die Spalte name nicht BEIDES "/ detail" und "/ topic" in derselben Zeile, sondern in mehreren Zeilen enthält. – DRapp

+0

@DRAP Entschuldigung, es sollte 'oder' nicht 'und' Ich habe es behoben. – Hogan