2010-04-02 6 views
2

J'ai une situation où je renvoie des résultats avec plusieurs lignes. Je cherche un moyen de retourner une seule ligne, avec les multiples éléments dans des colonnes séparées dans la rangée. Ma requête initiale:requête pour renvoyer une seule ligne avec les éléments multiples dans des colonnes distinctes dans la ligne

SELECT a.name, a.city, a.address, a.abbrv, b.urltype, b.url 
FROM jos__universityTBL as a 
LEFT JOIN jos__university_urlTBL as b on b.universityID = a.ID 
WHERE a.stateVAL = 'CA' 

Ma sortie:

| University Of Southern Califor   | Los Angeles   |   | usc |  2 | http://web-app.usc.edu/ws/soc/api/                          | 
| University Of Southern Califor   | Los Angeles   |   | usc |  4 | http://web-app.usc.edu/ws/soc/api/                          | 
| University Of Southern Califor   | Los Angeles   |   | usc |  1 | www.usc.edu                                | 
| San Jose State University    | San Jose   |   | sjsu |  2 | http://info.sjsu.edu/home/schedules.html                        | 
| San Jose State University    | San Jose   |   | sjsu |  4 | https://cmshr.sjsu.edu/psp/HSJPRDF/EMPLOYEE/HSJPRD/c/COMMUNITY_ACCESS.CLASS_SEARCH.GBL?FolderPath=PORTAL_ROOT_OBJECT.PA_HC_CLASS_SEARCH | 
| San Jose State University    | San Jose   |   | sjsu |  1 | www.sjsu.edu                                

Mon schéma de la table ...

mysql> describe jos_universityTBL; 
+----------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+----------------+--------------+------+-----+---------+----------------+ 
| name   | varchar(50) | NO | UNI |   |    | 
| repos_dir_name | varchar(50) | NO |  |   |    | 
| city   | varchar(20) | YES |  |   |    | 
| stateVAL  | varchar(5) | NO |  |   |    | 
| address  | varchar(50) | NO |  |   |    | 
| abbrv   | varchar(20) | NO |  |   |    | 
| childtbl  | varchar(200) | NO |  |   |    | 
| userID   | int(10)  | NO |  | 0  |    | 
| ID    | int(10)  | NO | PRI | NULL | auto_increment | 
+----------------+--------------+------+-----+---------+----------------+ 
9 rows in set (0.00 sec) 

mysql> describe jos_university_urlTBL; 
+--------------+--------------+------+-----+---------+----------------+ 
| Field  | Type   | Null | Key | Default | Extra   | 
+--------------+--------------+------+-----+---------+----------------+ 
| universityID | int(10)  | NO |  | 0  |    | 
| urltype  | int(5)  | NO |  | 0  |    | 
| url   | varchar(200) | NO | MUL |   |    | 
| actionID  | int(5)  | YES |  | 0  |    | 
| status  | int(5)  | YES |  | 0  |    | 
| ID   | int(10)  | NO | PRI | NULL | auto_increment | 
+--------------+--------------+------+-----+---------+----------------+ 
6 rows in set (0.00 sec) 

Je suis vraiment essayer d'obtenir quelque chose comme:

        |<<the concated urltype-url >>| 
ucs | losangeles | usc.edu | 1-u1 | 2-u2 | 3-u2 | 

Répondre

1

Vous pouvez utiliser group_concat:

SELECT a.name, a.city, a.address, a.abbrv, b.urltype, 
    group_concat(b.url SEPARATOR ' ') 
FROM jos__universityTBL as a 
LEFT JOIN jos__university_urlTBL as b on b.universityID = a.ID 
WHERE a.stateVAL = 'CA' 
GROUP BY a.name, a.city, a.address, a.abbrv, b.urltype 

La génération de colonnes dynamiques est difficile dans SQL; Dans la mesure du possible, voyez s'il peut être déplacé du côté client. Sinon, vous pouvez ajouter un numéro de ligne dans une sous-requête et attribuer à chaque numéro de ligne sa propre colonne. Voici un exemple avec des tables légèrement différentes:

drop table if exists Universities; 
drop table if exists Urls; 
create table Universities (
    id int auto_increment primary key 
, Name varchar(50) 
); 
create table Urls (
    id int auto_increment primary key 
, UniversityId int 
, Url varchar(50) 
); 
insert into Universities (name) values ('USC'), ('SJSU'); 
insert into Urls (UniversityId, Url) values 
    (1,'http://a/'), (1,'http://b/'), 
    (2,'http://c/'), (2,'http://d/'), (2,'http://e/'); 

SELECT 
    Name 
, group_concat(case RowNr when 1 then Url end) as FirstCol 
, group_concat(case RowNr when 2 then Url end) as SecondCol 
, group_concat(case RowNr when 3 then Url end) as ThirdCol 
FROM (
    SELECT 
     u.Name 
    , l.Url 
    , (@i := case when @LastUni = u.Name then @i + 1 else 1 end) as RowNr 
    , @LastUni := u.name 
    FROM Universities u 
    JOIN Urls l ON u.id = l.UniversityId 
    JOIN (SELECT @i := 0, @LastUni := '') init 
) subquery 
GROUP BY Name; 

Cette impression:

SJSU  http://c/ http://d/ http://e/ 
USC  http://a/ http://b/ NULL 
+0

Oui, ce que je voulais dire, voudrait probablement le délimiteur comme certains caractères spéciaux comme SEPERATOR « | » – MindStalker

Questions connexes