query per restituire una singola riga con i molteplici elementi in colonne separate all'interno della fila
-
24-09-2019 - |
Domanda
Ho una situazione in cui torno risultati con più righe. Sto cercando un modo per restituire una singola riga, con le molteplici elementi in colonne separate all'interno della riga. La mia domanda iniziale:
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'
La mia uscita:
| 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
Il mio tavolo schema ...
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)
Sono davvero cercando di ottenere qualcosa di simile:
|<<the concated urltype-url >>|
ucs | losangeles | usc.edu | 1-u1 | 2-u2 | 3-u2 |
Soluzione
Si potrebbe usare 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
colonne dinamici Generazione è difficile in SQL; se possibile, vedere se può essere spostato al lato client. In caso contrario, è possibile aggiungere un numero di riga in una sottoquery, e dare ad ogni numero di riga proprio colum. Ecco un esempio con tavoli leggermente diverse:
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;
Questo stampa:
SJSU http://c/ http://d/ http://e/
USC http://a/ http://b/ NULL
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow