2010-06-10 7 views

Répondre

7

Comme @Mark suggested, GROUP_CONCAT() peut vous donner le résultat suivant:

SELECT id, subject, GROUP_CONCAT(mark SEPARATOR ' & ') marks 
FROM  results 
GROUP BY id, subject; 
+------+---------+---------+ 
| id | subject | marks | 
+------+---------+---------+ 
| 1 | English | 50 & 60 | 
| 1 | Maths | 32  | 
| 1 | Science | 40 & 45 | 
+------+---------+---------+ 
3 rows in set (0.00 sec) 

A partir de ce cas de test:

CREATE TABLE results (id int, subject varchar(10), mark int); 

INSERT INTO results VALUES (1, 'Maths', 32); 
INSERT INTO results VALUES (1, 'Science', 40); 
INSERT INTO results VALUES (1, 'Science', 45); 
INSERT INTO results VALUES (1, 'English', 50); 
INSERT INTO results VALUES (1, 'English', 60); 

Cependant, une autre façon d'aborder le problème serait en utilisant comme sous requête pour chaque Sujet:

SELECT r.id, 
      (SELECT GROUP_CONCAT(r_eng.mark SEPARATOR ' & ') 
      FROM  results r_eng 
      WHERE r_eng.subject = 'English' AND r_eng.id = r.id) English, 
      (SELECT GROUP_CONCAT(r_eng.mark SEPARATOR ' & ') 
      FROM  results r_eng 
      WHERE r_eng.subject = 'Maths' AND r_eng.id = r.id) Maths, 
      (SELECT GROUP_CONCAT(r_eng.mark SEPARATOR ' & ') 
      FROM  results r_eng 
      WHERE r_eng.subject = 'Science' AND r_eng.id = r.id) Science 
FROM  results r 
GROUP BY r.id; 

Qui donnera e résultat suivant:

+------+---------+-------+---------+ 
| id | English | Maths | Science | 
+------+---------+-------+---------+ 
| 1 | 50 & 60 | 32 | 40 & 45 | 
+------+---------+-------+---------+ 
1 row in set (0.01 sec) 

MISE À JOUR:

Suite aux commentaires, il semble que vous devez prendre le champ year en considération. Heureusement, la fonction GROUP_CONCAT() prend une clause ORDER BY que nous pouvons utiliser.Commençons par un nouveau cas de test avec le champ de l'année:

CREATE TABLE results (id int, subject varchar(10), mark int, year int); 

INSERT INTO results VALUES (1, 'Maths', 32, 2008); 
INSERT INTO results VALUES (1, 'Science', 40, 2009); 
INSERT INTO results VALUES (1, 'Science', 45, 2008); 
INSERT INTO results VALUES (1, 'English', 50, 2009); 
INSERT INTO results VALUES (1, 'English', 60, 2008); 

SELECT * FROM results; 
+------+---------+------+------+ 
| id | subject | mark | year | 
+------+---------+------+------+ 
| 1 | Maths | 32 | 2008 | 
| 1 | Science | 40 | 2009 | 
| 1 | Science | 45 | 2008 | 
| 1 | English | 50 | 2009 | 
| 1 | English | 60 | 2008 | 
+------+---------+------+------+ 
5 rows in set (0.00 sec) 

Ensuite, nous serions en mesure d'utiliser la fonction GROUP_CONCAT() avec la clause ORDER BY comme suit:

SELECT id, 
     subject, 
     GROUP_CONCAT(mark ORDER BY year SEPARATOR ' & ') marks, 
     GROUP_CONCAT(year ORDER BY year SEPARATOR ' & ') years 
FROM  results 
GROUP BY id, subject; 

+------+---------+---------+-------------+ 
| id | subject | marks | years  | 
+------+---------+---------+-------------+ 
| 1 | English | 60 & 50 | 2008 & 2009 | 
| 1 | Maths | 32  | 2008  | 
| 1 | Science | 45 & 40 | 2008 & 2009 | 
+------+---------+---------+-------------+ 
3 rows in set (0.00 sec) 

Enfin, pour GROUP BY tout en un ligne horizontale, nous pouvons utiliser la technique de sous-requête que nous avons utilisé dans l'exemple précédent:

SELECT r.id, 
      (SELECT GROUP_CONCAT(r_eng.mark ORDER BY year SEPARATOR ' & ') 
      FROM results r_eng 
      WHERE r_eng.subject = 'English' AND r_eng.id = r.id) English, 
      (SELECT GROUP_CONCAT(r_eng.year ORDER BY year SEPARATOR ' & ') 
      FROM results r_eng 
      WHERE r_eng.subject = 'English' AND r_eng.id = r.id) Years_English, 
      (SELECT GROUP_CONCAT(r_eng.mark ORDER BY year SEPARATOR ' & ') 
      FROM results r_eng 
      WHERE r_eng.subject = 'Maths' AND r_eng.id = r.id) Maths, 
      (SELECT GROUP_CONCAT(r_eng.year ORDER BY year SEPARATOR ' & ') 
      FROM results r_eng 
      WHERE r_eng.subject = 'Maths' AND r_eng.id = r.id) Years_Maths, 
      (SELECT GROUP_CONCAT(r_eng.mark ORDER BY year SEPARATOR ' & ') 
      FROM results r_eng 
      WHERE r_eng.subject = 'Science' AND r_eng.id = r.id) Science, 
      (SELECT GROUP_CONCAT(r_eng.year ORDER BY year SEPARATOR ' & ') 
      FROM results r_eng 
      WHERE r_eng.subject = 'Science' AND r_eng.id = r.id) Years_Science 
FROM  results r 
GROUP BY r.id; 

qui retourne le fol mugissement:

+----+---------+---------------+-------+-------------+---------+---------------+ 
| id | English | Years_English | Maths | Years_Maths | Science | Years_Science | 
+----+---------+---------------+-------+-------------+---------+---------------+ 
| 1 | 60 & 50 | 2008 & 2009 | 32 | 2008  | 45 & 40 | 2008 & 2009 | 
+----+---------+---------------+-------+-------------+---------+---------------+ 
1 row in set (0.01 sec) 

Si vous vouliez les marques et les années ordonnées par ordre décroissant, vous pouvez simplement ajouter le mot-clé DESC après chaque ORDER BY year.

+0

J'ai besoin de résultats en fonction de l'année, puis je veux afficher dans une ligne horizontale. – subakaran

+0

ID OBJETS MARQUES ANNÉE
1 Anglais 50 & 60 2008 & 2009 J'ai besoin de ceci – subakaran

+0

@subakaran: Que voulez-vous dire exactement par "basé sur l'année"? ... Vous voulez dire que les premières marques devraient apparaître en premier? –

1

Pour la première étape, jetez un oeil à la group_concat() functiopn dans une base MySQL, il peut être d'une certaine aide

SELECT `id`, 
     `subject`, 
     group_concat(`mark` 
        ORDER BY `year` DESC 
        SEPARATOR ' & ' 
        ) marks 
    FROM `subjects` 
GROUP BY `id`, 
      `subject` 

MISE À JOUR a réussi à aller aussi loin que

SELECT `id`, 
     IF (`subject` = 'English', `marks`, NULL) AS English, 
     IF (`subject` = 'Maths', `marks`, NULL) AS Maths, 
     IF (`subject` = 'Science', `marks`, NULL) AS Science 
    FROM (SELECT `id`, 
       `subject`, 
       group_concat(`mark` 
           ORDER BY `year` DESC 
           SEPARATOR ' & ' 
          ) marks 
      FROM `subjects` 
      GROUP BY `id`, 
        `subject` 
     ) x 
GROUP BY `id`, 
     `subject` 

qui retourne

+----+---------+-------+---------+ 
| id | English | Maths | Science | 
+----+---------+-------+---------+ 
| 1 | 50 & 60 | NULL | NULL | 
| 1 | NULL | 32 | NULL | 
| 1 | NULL | NULL | 40 & 45 | 
+----+---------+-------+---------+ 
3 rows in set (0.01 sec) 

mais ne peut tout à fait obtenir ce dernier regroupement à droite pour le renvoyer tous en une seule ligne. Je ne sais pas si quelqu'un d'autre peut m'aider à obtenir la dernière étape juste en prenant cette approche au problème .... ordinairement, je retournerais le résultat à PHP "tel quel", et faire le regroupement final là; mais une solution MySQL complète serait intéressante.

+0

J'ai besoin de requête Mysql seulement. Merci pour la réponse immédiate – subakaran

+0

Salut Mark, Merci pour votre réponse. Je pense, j'ai besoin d'en savoir plus sur la fonction CONCAT() de mysql. Merci – subakaran

+0

Merci pour votre aide. J'ai obtenu une solution de M. Daniel. Merci. "IF" est également bon. – subakaran

Questions connexes