2016-07-19 3 views
1

ich eine MySQL-Tabelle mit der folgenden Struktur habenMySQL traspose Tabelle

|user_id|action_type|action_value|timestamp | 
|-------|-----------|------------|----------| 
|123 |click  |search  |20-07-2016| 
|231 |click  |search  |20-07-2016| 
|123 |click  |delete  |20-07-2016| 

Die Sache ist, action_type können mehrere Werte annehmen, sie Tabellenspalten sein könnte, aber sind dynamisch so entscheiden, ich sie als Werte in ein setzen Spalte, action_value ist der Wert, der einen action_type annehmen kann. Dies sind Aktion pro Nutzer/pro Tag, und ich habe mich gefragt, ob es möglich ist, eine Abfrage zu machen, die die folgenden

|action_type|timestamp |search|delete| 
|-----------|----------|------|------| 
|click  |20-07-2016|2  |1  | 
|-----------|----------|------|------| 

für eine gegebene action_type zurück, kehren alle Benutzer, die diese Aktion und Gruppe durch Zeitstempel führen.

Ich habe versucht, die folgende Abfrage, aber ich bin nur die gleiche Zahl immer in beiden Spalten

SELECT T1.action_type, DATE(T1.timestamp), count(T1.action_value) 'search', count(T2.action_value) 'delete' FROM cohort_actions T1 INNER JOIN (SELECT timestamp, action_value FROM cohort_actions WHERE action_value = 'delete') T2 ON DATE(T1.timestamp) = DATE(T2.timestamp) WHERE T1.action_type = 'click' AND T1.action_value = 'search' GROUP BY DATE(T1.timestamp); 

Antwort

2

Wenn Sie nur eine Teilmenge der Zeilen zählen müssen, um einen Ausdruck verwenden, die NULL ist, wenn Sie don Ich will nicht zählen. COUNT() ignoriert NULL.

SELECT action_type, DATE(timestamp) AS `timestamp`, 
    COUNT(CASE action_type WHEN 'click' THEN action_value END) AS `search`, 
    COUNT(CASE action_type WHEN 'delete' THEN action_value END) AS `delete`, 
FROM cohort_actions 
GROUP BY action_type, DATE(timestamp); 

Da ich das Ergebnis des Ausdrucks keine ELSE-Klausel für die CASE-Ausdrücke haben, NULL, wenn der action_type der gewünschte Wert ist.