2016-07-27 7 views
0

Ich versuche, die Anzahl der verschiedenen Werte mit anderen WHERE in den Abfragen abrufen, aber sie alle gruppiert durch den gleichen Wert.Mehrere Anzahl Abfragen mit derselben Gruppierung

Ich habe versucht, mit folgendem Beispiel:

$sql = "SELECT * FROM ( SELECT COUNT(id) AS mail FROM leadz WHERE source = 'mail' UNION ALL 
       SELECT COUNT(id) AS phone FROM leadz WHERE source = 'phone' UNION ALL 
       SELECT COUNT(id) AS direct FROM leadz WHERE source = 'direct' UNION ALL 
       SELECT COUNT(id) AS external FROM leadz WHERE source = 'external' 
         ) GROUP BY date"; 

Dann auf die Daten zugreifen Ich versuche, durch den Einsatz:

$query = mysqli_query($con,$sql); 
while($row = mysqli_fetch_assoc($query)){ 
    echo "in date ".$row['date'].": ".$row['mail'].",".$row['phone'].",".$row['direct'].",".$row['external']."<br>"; 

offensichtlich Dies funktioniert nicht. Jeder Hilfe wird geschätzt.

+0

Warum 'GROUP BY date' hier? – Blank

+0

Ich brauche diese Zählungen nach Datum gruppiert, so dass ich jeden für jeden Tag zählen kann. – buxbeatz

+0

OK, ich denke, Sie müssen einige Beispieldaten und das gewünschte Ergebnis hinzufügen, damit wir das klar verstehen. – Blank

Antwort

0

Sie etwas versuchen könnte, wo anstelle von separaten Unterabfragen Sie verwenden CASE-Anweisung mit einer Summe thusly:

Originalcode:

$sql = "SELECT * FROM ( SELECT COUNT(id) AS mail FROM leadz WHERE source = 'mail' UNION ALL 
      SELECT COUNT(id) AS phone FROM leadz WHERE source = 'phone' UNION ALL 
      SELECT COUNT(id) AS direct FROM leadz WHERE source = 'direct' UNION ALL 
      SELECT COUNT(id) AS external FROM leadz WHERE source = 'external' 
        ) GROUP BY date"; 
unter Verwendung einer Summe von mit Bedingungen

Aktualisiert:

$sql = "SELECT 
l.DATE 
,SUM(CASE WHEN l.SOURCE = 'mail' THEN 1 ELSE 0 END) AS SOURCE_MAIL 
,SUM(CASE WHEN l.SOURCE = 'phone' THEN 1 ELSE 0 END) AS SOURCE_PHONE 
,SUM(CASE WHEN l.SOURCE = 'direct' THEN 1 ELSE 0 END) AS SOURCE_DIRECT 
,SUM(CASE WHEN l.SOURCE = 'external' THEN 1 ELSE 0 END) AS SOURCE_EXTERNAL 
FROM LEADZ AS l 
GROUP BY l.DATE"; 

dann die Ausgabe in PHP zugreifen, die Sie so etwas wie dies nutzen könnten:

$result = mysqli_query($link,$sql); 
while($r = mysqli_fetch_array($result)) { 
extract($r); 
echo $DATE.'<BR>'. 
'mail: '$SOURCE_MAIL.'<BR>'. 
'phone: '$SOURCE_PHONE.'<BR>'. 
'direct: '$SOURCE_DIRECT.'<BR>'. 
'external: '$SOURCE_EXTERNAL.'<BR><hr>'; 
} 
+0

Dies würde 1 Zeile pro Datum mit Zählungen der verschiedenen Quellen zurückgeben. Wenn die bevorzugte Ausgabe Zeilen sind, dann hat @fantaghirocco die bessere Lösung. – Jeff

+0

Das brauche ich! :) Mit dieser Abfrage wie würde ich auf die Daten mit PHP zugreifen, um eine Zählung von Mail, Telefon, direkt und extern für jeden Tag anzuzeigen? – buxbeatz

+0

Hast du das bekommen, was du brauchst? – Jeff

0

So etwas sollte funktionieren:

SELECT date, source, COUNT(id) AS how_many 
FROM leadz 
WHERE source IN ('mail', 'phone', 'direct', 'external') 
GROUP BY date, source 
ORDER BY date 

Eine temporäre Array verwendet werden können Zeilen in Spalten zu setzen:

$tmp = array(); 

$query = mysqli_query($con,$sql); 
while($row = mysqli_fetch_assoc($query)) 
    $tmp[$row['date']][$row['source']] = $row['how_many']; 

foreach ($tmp as $date => $source) 
    echo 'in date ' . $date . ': ' . $source['mail'] . ',' . $source['phone'] . ',' . $source['direct'] . ',' . $source['external'] . '<br>' . "\r\n"; 
+0

Mit dieser Abfrage, wie würde ich auf die Daten mit PHP zugreifen, um eine Zählung von Mail, Telefon, direkt und extern für jeden Tag anzuzeigen? – buxbeatz

+0

verfolgen Sie das gleiche "Datum" in der Schleife und schalten Sie dann den 'source' Inhalt – fantaghirocco

+0

was Sie versuchen zu erreichen ist, Zeilen in Spalte zu setzen: es ist keine triviale Aufgabe in vielen RDBMS. Ich denke, du solltest deine SQL so einfach wie möglich halten und den Trick mit dem PHP-Skript machen – fantaghirocco