2016-04-23 5 views
-2

Jedes Tabellenfeld ist als 00 00 00 00 00 00 festgelegt. Ich versuche, eine Lösung zu finden, um jede 00 00 00 00 00 00 Nummer in jeder Spalte zu zählen Feld. Der Code unten funktioniert gut, aber es ist hässlich und ich bin nicht in der Lage, die Ergebnisse zu bestellen. Vielen Dank!Mysql ORDER BY COUNT jeder Wert für jedes Spaltenfeld

Gewünschtes Ergebnis (Beispiel)

Number - Zeiten in Spalte

  • 01 erscheint - 100
  • 02-99
  • 03 - 98

COLUMN SAMPLE

enter image description here

if ($stmt = $post_con->prepare('SELECT asw FROM tb WHERE CONCAT(" ", asw, " ") LIKE CONCAT("% ", ?, " %")')) { 


    for($i = 1; $i < 60; $i++){ 

       $stmt->bind_param("s", $de); 
       $de = sprintf('%02d', $i); 

       $stmt->execute(); 
       $stmt->store_result(); 
       $qty = $stmt->num_rows; 

       /* bind result variables */ 
       $stmt->bind_result($asw); 
       $stmt->fetch(); 

       echo $qty.' -> '.$de.'</br>'; 

       $stmt->close(); 


     } 
+1

Sie sagen 1) eine Beispielzeile von 'tb' könnte einen Wert wie' 00 00 00 00 01' haben? 2) Sie möchten die einzelnen Vorkommen von '00',' 01', ..etc zählen. in der ganzen Tabelle? (Wenn also meine Beispielzeile die einzige Zeile wäre, wäre die Ausgabe "00 -> 4
01 -> 1"? – Terminus

+0

Nein. Ich möchte zählen, wie oft 00 oder 01 (und jede der sechsstelligen Zahlen) erscheint in der Spalte nicht in dem Feld. Danke @Terminus – Tom

+0

Würde es Ihnen etwas ausmachen, einige Beispielzeilen (wie 3 oder 4) und die erwartete Ausgabe von diesen Zeilen zu zeigen? Es könnte möglich sein, dies alles in einer einzelnen Abfrage zu tun, aber ich muss siehe ein etwas vollständigeres Beispiel – Terminus

Antwort

0

Sie SQL verwenden können mehr von der Arbeit zu tun für Sie. Sie können die Abfrage von this question auf Ihre Situation anwenden.

Die Unterabfrage bricht alle Zahlen in eine eigene Zeile. Es verwendet die SELECT 1 UNION ALL ... SELECT 6, um die 1. Nummer, ..., und die 6. Nummer zu finden und jede in eine eigene Zeile zu setzen. (Beachten Sie, dass Sie bis 6 gehen müssen, weil Sie 6 Zahlen pro Zeile haben. Wenn Sie mehr hatten, müssten Sie die Abfrage entsprechend anpassen.)

Von dort ist es so einfach wie GROUP BY auf die Nummer, COUNT() ing die eindeutigen Vorkommen und ORDER BY die Nummer in ASC Endreihenfolge.

SELECT num, COUNT(num) 
FROM (
    SELECT 
    SUBSTRING_INDEX(SUBSTRING_INDEX(tb.asw, ' ', numbers.n), ' ', -1) num 
    FROM 
    (SELECT 1 n UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 
    ) AS numbers 
    INNER JOIN tb 
    ON CHAR_LENGTH(tb.asw) 
     -CHAR_LENGTH(REPLACE(tb.asw, ' ', ''))>=numbers.n-1 
) numNumbers 
GROUP BY num 
ORDER BY num ASC 
0

Etwas mehr bewährten Verfahren wäre aber schwer, ohne mehr Details zu sagen laut, was Sie suchen:

$stmt = $post_con->prepare('SELECT asw, count(asw) as count FROM tb WHERE CONCAT(" ", asw, " ") LIKE CONCAT("% ", ?, " %") GROUP BY asw ORDER BY count DESC LIMIT 1'); 
for ($i = 1; $i < 60; $i++) { 
    $stmt->bind_param(1, sprintf('%02d', $i)); 
    $stmt->execute(); 
    $obj = $stmt->fetchall(PDO::FETCH_ASSOC); 
    if (count($obj) !== 0) { 
     echo $de . '->' . $obj['count'] . '</br>'; 
    } 
} 
$stmt->close(); 
+0

Ich möchte etwas besser, um diese "for-Schleife" zu ersetzen und die Ergebnisse bestellen. Danke CPU! – Tom

+0

Schleife ist in Ordnung. Schließen Sie nicht Ihren Stmt innerhalb der Schleife oder Sie verlieren alle Vorteile des vorbereiteten Stmt. hängt davon ab, ob Sie nach einer Reihe von Ergebnissen oder nur einer suchen. Dieses Beispiel gilt nur für eine (höchste Anzahl). – cpugourou

+0

danke, wie kann ich die "Zählung" bestellen? – Tom