2016-07-02 48 views
14

Ho 2 tabelle
Come utilizzare le funzioni di aggregazione in mysql?

  1. studenti
  2. pagamenti

In tabella studenti ho campi come

student_id(Primary key), 
student_name, 
student_university, 
student_counselor 

In tabella pagamenti ho campi come

payment_id(Primary key), 
student_id(Foreign key reference to students table), 
payable, 
paid, 
balance 

enter image description here

sto cercando di achive:

  • visualizzare il risultato nel modulo sottostante cioè ogni consigliere ha i propri studenti in diverse università.
  • Il numero totale di studenti appartiene a un'università particolare da parte di un consulente specifico e quanto è dovuto, pagato e saldo come mostrato nella tabella sopra.

Qualche idea?

+1

per questo output è necessario utilizzare query di join con gruppo per –

risposta

26

CREATE per la tabella degli studenti:

CREATE TABLE `student` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(45) DEFAULT NULL, 
    `university` varchar(45) DEFAULT NULL, 
    `counselor` varchar(45) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; 

Crea una tabella pagamento dichiarazione:

CREATE TABLE `payment` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `student_id` int(11) DEFAULT NULL, 
    `payable` int(11) NOT NULL DEFAULT '0', 
    `paid` int(11) NOT NULL DEFAULT '0', 
    `balance` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `FK payment student_id student id_idx` (`student_id`), 
    CONSTRAINT `FK payment student_id student id` FOREIGN KEY (`student_id`) REFERENCES `student` (`id`) ON DELETE SET NULL ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8; 

studenti e dei pagamenti inserimento dei dati

INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 1', 'u 1', 'c 1'); 
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 2', 'u 1', 'c 1'); 
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 3', 'u 1', 'c 2'); 
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 4', 'u 1', 'c 2'); 
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 5', 'u 2', 'c 3'); 
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 6', 'u 2', 'c 3'); 
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 7', 'u 2', 'c 4'); 
INSERT INTO `student` (`name`, `university`, `counselor`) VALUES ('student 8', 'u 2', 'c 4'); 
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('1', 500, 300, 200); 
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('2', 500, 300, 200); 
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('3', 400, 400, 400); 
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('4', 400, 400, 400); 
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('5', 100, 200, 300); 
INSERT INTO `payment` (`student_id`, `payable`, `paid`, `balance`) VALUES ('6', 51, 52, 53); 

Ed ecco ciò che abbiamo:

mysql> select * from student; 
+----+-----------+------------+-----------+ 
| id | name  | university | counselor | 
+----+-----------+------------+-----------+ 
| 1 | student 1 | u 1  | c 1  | 
| 2 | student 2 | u 1  | c 1  | 
| 3 | student 3 | u 1  | c 2  | 
| 4 | student 4 | u 1  | c 2  | 
| 5 | student 5 | u 2  | c 3  | 
| 6 | student 6 | u 2  | c 3  | 
| 7 | student 7 | u 2  | c 4  | 
| 8 | student 8 | u 2  | c 4  | 
+----+-----------+------------+-----------+ 
8 rows in set (0.02 sec) 


mysql> select * from payment; 
+----+------------+---------+------+---------+ 
| id | student_id | payable | paid | balance | 
+----+------------+---------+------+---------+ 
| 1 |   1 |  500 | 300 |  200 | 
| 2 |   2 |  500 | 300 |  200 | 
| 3 |   3 |  400 | 400 |  400 | 
| 4 |   4 |  400 | 400 |  400 | 
| 5 |   5 |  100 | 200 |  300 | 
| 6 |   6 |  51 | 52 |  53 | 
+----+------------+---------+------+---------+ 
6 rows in set (0.00 sec) 

query stessa per selezionare tutto consigliere:

SELECT 
    counselor, 
    university, 
    COUNT(name) AS 'no of students', 
    SUM(payment.payable) AS payable, 
    SUM(payment.paid) AS paid, 
    SUM(payment.balance) AS balance 
FROM 
    student 
     LEFT JOIN 
    payment ON payment.student_id = student.id 
GROUP BY counselor; 

risultato:

mysql>  SELECT 
    ->   counselor, 
    ->   university, 
    ->   COUNT(name) AS 'no of students', 
    ->   SUM(payment.payable) AS payable, 
    ->   SUM(payment.paid) AS paid, 
    ->   SUM(payment.balance) AS balance 
    ->  FROM 
    ->   student 
    ->    LEFT JOIN 
    ->   payment ON payment.student_id = student.id 
    ->  GROUP BY counselor; 
+-----------+------------+----------------+---------+------+---------+ 
| counselor | university | no of students | payable | paid | balance | 
+-----------+------------+----------------+---------+------+---------+ 
| c 1  | u 1  |    2 | 1000 | 600 |  400 | 
| c 2  | u 1  |    2 |  800 | 800 |  800 | 
| c 3  | u 2  |    2 |  151 | 252 |  353 | 
| c 4  | u 2  |    2 | NULL | NULL | NULL | 
+-----------+------------+----------------+---------+------+---------+ 

Inoltre non è necessario utilizzare il prefisso student su tutti i campi in student tabella. È ovvio che il numero name nella tabella student indichi il nome dello studente e così via.

E qui è semplicemente il codice php per stampare la tabella.

Questo è db collegare classe in modo da poter saltare:

define('DB_MAIN', 'localhost|someroot|some|db'); 

class my_db{ 

    private static $databases; 
    private $connection; 

    public function __construct($connDetails){ 
     if(!is_object(self::$databases[$connDetails])){ 
      list($host, $user, $pass, $dbname) = explode('|', $connDetails); 
      $dsn = "mysql:host=$host;dbname=$dbname"; 
      self::$databases[$connDetails] = new PDO($dsn, $user, $pass); 
     } 
     $this->connection = self::$databases[$connDetails]; 
    } 

    public function fetchAll($sql){ 
     $args = func_get_args(); 
     array_shift($args); 
     $statement = $this->connection->prepare($sql); 
     $statement->execute($args); 
     return $statement->fetchAll(PDO::FETCH_OBJ); 
    } 
} 


$db = new my_db(DB_MAIN); 

codice php principale stessa:

$universities = $db->fetchAll('SELECT distinct university FROM student'); 
$counselors = $db->fetchAll('SELECT distinct counselor FROM student'); 
$payments_ = $db->fetchAll(' SELECT 
    counselor, 
    university, 
    COUNT(name) AS \'no of students\', 
    SUM(payment.payable) AS payable, 
    SUM(payment.paid) AS paid, 
    SUM(payment.balance) AS balance 
FROM 
    student 
     LEFT JOIN 
    payment ON payment.student_id = student.id 
GROUP BY counselor;'); 

$payments = []; 

foreach ($payments_ as $payment) 
    $payments[$payment->counselor][$payment->university] = $payment; 
?> 



<table border="1"> 
    <tr> 
     <td rowspan="2" >counselor</td> 
<?php 
    foreach ($universities as $key => $university){ ?> 

     <td colspan="4" ><?=$university->university ?> </td> 
    <?php } ?> 
    </tr> 
    <tr> 
    <?php foreach ($universities as $university){?> 
     <td>no of students</td> 
     <td>payable</td> 
     <td>paid</td> 
     <td>balance</td> 
    <?php } ?> 
    </tr> 
    <tr> 
    <?php foreach ($counselors as $counselor){?> 
    <?php foreach ($universities as $key => $university){ 
     $payment = $payments[$counselor->counselor][$university->university]; 
    ?> 
     <?php if(!$key){?> 
     <td><?=$counselor->counselor?></td> 
     <?php } ?> 
     <td><?=(int)$payment->{'no of students'}?></td> 
     <td><?=number_format($payment->payable,0,',','')?></td> 
     <td><?=number_format($payment->paid,0,',','')?></td> 
     <td><?=number_format($payment->balance,0,',','')?></td> 
    <?php } ?> 
    </tr> 
    <?php } ?> 
</table> 

risultato html

<table border="1"> 
 
    <tr> 
 
    <td rowspan="2">counselor</td> 
 

 
    <td colspan="4">u 1 </td> 
 

 
    <td colspan="4">u 2 </td> 
 
    </tr> 
 
    <tr> 
 
    <td>no of students</td> 
 
    <td>payable</td> 
 
    <td>paid</td> 
 
    <td>balance</td> 
 
    <td>no of students</td> 
 
    <td>payable</td> 
 
    <td>paid</td> 
 
    <td>balance</td> 
 
    </tr> 
 
    <tr> 
 
    <td>c 1</td> 
 
    <td>2</td> 
 
    <td>1000</td> 
 
    <td>600</td> 
 
    <td>400</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    </tr> 
 
    <tr> 
 
    <td>c 2</td> 
 
    <td>2</td> 
 
    <td>800</td> 
 
    <td>800</td> 
 
    <td>800</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    </tr> 
 
    <tr> 
 
    <td>c 3</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    <td>2</td> 
 
    <td>151</td> 
 
    <td>252</td> 
 
    <td>353</td> 
 
    </tr> 
 
    <tr> 
 
    <td>c 4</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    <td>2</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    <td>0</td> 
 
    </tr> 
 
</table>

+1

Magnifico lavoro. +50 è troppo piccolo per una tale risposta. –

+1

+1 per così tanto sforzo! Fantastico ... ma non devi fornire tutte queste cose per l'OP. A proposito, sta solo chiedendo "qualsiasi intuizione": D – rhavendc

+2

@rhavendc ricorda che l'obiettivo principale di Stack Overflow è fornire a tutti gli sviluppatori * tutti * conoscenza, non solo uno che ha chiesto. Devi sempre tenerlo a mente quando rispondi. –

1
AVG() - Returns the average value. 
COUNT() - Returns the number of rows. 
FIRST() - Returns the first value. 
LAST() - Returns the last value. 
MAX() - Returns the largest value. 
MIN() - Returns the smallest value. 
SUM() - Returns the sum. 

COUNT Funzione

La funzione COUNT restituisce il numero totale di valori nel campo specificato.

Supponiamo che vogliamo ottenere il numero di volte che il film con id 2 è stato affittato fuori

SELECT COUNT (movie_id) FROM WHERE movierentalsmovie_id = 2;

funzione MIN

La funzione MIN restituisce il valore più piccolo nel campo tabella specificata.

funzione MAX

Come suggerisce il nome, la funzione MAX è l'opposto della funzione MIN. Restituisce il valore più grande dal campo della tabella specificata. SELECT MAX (year_released) DA movies;

funzione somma

funzione SOMMA MySQL che restituisce la somma di tutti i valori nella colonna specificata. SUM funziona solo su campi numerici. I valori nulli sono esclusi dal risultato restituito.

SELECT SUM (amount_paid) DA payments;

funzione AVG

funzione MySQL AVG restituisce la media dei valori in una colonna specificata. Proprio come la funzione SUM, funziona solo su tipi di dati numerici.

SELECT AVG (amount_paid) DA payments;