2017-11-30 1 views
3

Ich habe 2 Tabelle und die zweite Tabelle Verwendung BeziehungSQL GROUP_CONCAT nicht alle Daten erhalten

table1 
id name 
--------- 
1 alpha 
2 beta 

table2 
id name relation 
------------------- 
1 2015 2 
2 2016 2 
3 2017 2 
4 2018 2 

I

name data 
------------------------- 
beta 2015,2016,2017,2018 
alpha NULL 

Ich habe versucht, die folgende SQL-Abfrage sehen möchten, aber der Ausgang ist nicht das, was ich wollte,

ich benutze:

SELECT 
    t1.name, 
    GROUP_CONCAT(t2.name SEPARATOR ',') 
FROM table1 AS t1 
LEFT JOIN table2 AS t2 
    ON t2.relation = t1.id 

Ausgang:

alpha 2015,2016,2017,2018 

Alpha keinen Wert in dem anderen verwandten Tabulatur bekommen. Die Werte in der Ausgabe gehören zur Beta.

+0

** G ** ROUP_CONCAT ... – jarlh

Antwort

3

Sie benötigen GROUP BY:

SELECT t1.name, 
     GROUP_CONCAT(t2.name SEPARATOR ',') 
FROM table1 t1 LEFT JOIN 
    table2 t2 
    ON t2.relation = t1.id 
GROUP BY t1.name; 

In den meisten Datenbanken (und neueren Versionen von MySQL) würde Ihre Abfrage fehlschlagen. Es ist eine Aggregationsabfrage (wegen der GROUP_CONCAT()). Aber t1.name ist kein Argument für eine Aggregationsfunktion und es ist kein Schlüssel GROUP BY.

MySQL erlaubt diese Art der Abfrage. Es gibt genau eine Zeile zurück. Der Wert t1.name für die eine Zeile in der Ergebnismenge stammt aus einer beliebigen Zeile.

+0

Gute Arbeit. Ich wollte das machen. Danke @Gordon – vulkan

0

Keine FKs für Geige:

CREATE TABLE Table1 (`id` int, `name` varchar(5)) ; 

INSERT INTO Table1 
    (`id`, `name`) 
VALUES 
    (1, 'alpha'), 
    (2, 'beta') 
; 


CREATE TABLE Table2 (`id` int, `name` int, `relation` int); 

INSERT INTO Table2 
    (`id`, `name`, `relation`) 
VALUES 
    (1, 2015, 2), 
    (2, 2016, 2), 
    (3, 2017, 2), 
    (4, 2018, 2) 
; 

Statement:

SELECT 
    t1.name, 
    GROUP_CONCAT(t2.name SEPARATOR ',') -- missing an AS .... => ugly name from fiddle 
FROM table1 AS t1 
LEFT JOIN table2 AS t2 
    ON t2.relation = t1.id 
group by t1.name 

Ausgang:

name GROUP_CONCAT(t2.name SEPARATOR ',') 
alpha (null) 
beta 2017,2018,2015,2016