2013-02-18 2 views
0

je la structure de tableau suivant:algorithme/requête pour obtenir des données statistiques de la table en utilisant php/mysql

CREATE TABLE test(
    myID INT, 
    num1 INT, 
    num2 INT, 
    num3 INT, 
    PRIMARY KEY (myID) 
)engine=innodb; 

maintenant j'ai les données suivantes dans le tableau:

myID num1 num2 num3 
1  15  27  98 
2  27  38  66 
3  15  27  77 

maintenant j'ai besoin Pour exécuter 2 requêtes, la première requête s'exécute pour sélectionner tous les nombres et du côté PHP je compte le nombre de fois que chaque nombre est apparu (fréquences), la deuxième requête doit sélectionner le deuxième nombre le plus fréquent. Première requête:

$numfreq = PDO->prepare(' 
       SELECT num1, num2, num3 
       FROM test 
      '); 
    $numfreq->execute(); 
    $allNums = array(); 
    while ($row = $numfreq->fetch(PDO::FETCH_ASSOC)) { 
     $allNums[] = intval($row['num1']); 
     $allNums[] = intval($row['num2']); 
     $allNums[] = intval($row['num3']); 
    } 

    $numFrequencies = array_count_values($allNums); 
    arsort($numFrequencies); 

cela renvoie correctement les fréquences de chaque numéro de la table. Maintenant, pour la deuxième partie

C'EST OÙ JE BESOIN D'AIDE:

Je reçois le nombre est apparu le plus souvent dans ce cas, son depuis sa fréquence est , je dois sélectionner que 1 numéro qui apparaît le plus à côté de signifie que je dois obtenir en quelque sorte le numéro car il apparaît deux fois à côté de .

Je peux probablement trouver l'algorithme sur le côté de PHP mais je me demandais si c'est possible de le faire en utilisant la requête?

de sorte que le résultat final serait:

most frequent number: 27 
most frequent number 27 combined with 15 appears 2 times and is most frequent combination. 

Répondre

1
select val, count(val) as frequency 
from 
(select num1 as val from test 
union all 
select num2 as val from test 
union all 
select num3 as val from test 
) as b 
group by val 
order by frequency desc 
limit 2 

Sqlfiddle here.

La requête interne convertit les trois colonnes en un ensemble de résultats avec une seule colonne - mettez en surbrillance la requête interne et vous verrez comment cela fonctionne. Nous utilisons ensuite ce jeu de résultats comme source pour la requête de comptage/commande.

+0

pouvez-vous expliquer la partie de requête interne avec des syndicats? – GGio

Questions connexes