2016-08-08 6 views
0

Ich habe zwei Tabellen: users und user_fingerprints.mysql Join die 2 Tabellen, um folgende Ausgabe zu produzieren

table

Wie kombiniere ich die beiden Tabellen, um die Ausgabe zu erzeugen?

Ich versuchte

select u.id, u.name, 
case f.finger (when 0 then 'y' else 'n' end) '0', 
case f.finger (when 1 then 'y' else 'n' end) '1', 
case f.finger (when 2 then 'y' else 'n' end) '2', 
case f.finger (when 3 then 'y' else 'n' end) '3', 
case f.finger (when 4 then 'y' else 'n' end) '4', 
case f.finger (when 5 then 'y' else 'n' end) '5', 
case f.finger (when 6 then 'y' else 'n' end) '6' 
from user u left join user_fingerprint f 
on u.id=f.user_id 
group by u.id 

aber das Ergebnis wird nehmen nur eine Reihe von gleicher ID und es in der Ausgabetabelle aktualisieren. wenn ich max Funktion verwende, hat es funktioniert, aber gibt es einen Weg ohne max zu verwenden?

Antwort

0

eine Aggregationsfunktion:

select u.id, u.name, 
     max(case f.finger when 0 then 'y' else 'n' end) as '0', 
     max(case f.finger when 1 then 'y' else 'n' end) as '1', 
     max(case f.finger when 2 then 'y' else 'n' end) as '2', 
     max(case f.finger when 3 then 'y' else 'n' end) as '3', 
     max(case f.finger when 4 then 'y' else 'n' end) as '4', 
     max(case f.finger when 5 then 'y' else 'n' end) as '5', 
     max(case f.finger when 6 then 'y' else 'n' end) as '6' 
from user u left join 
    user_fingerprint f 
    on u.id = f.user_id 
group by u.id; 

Ich würde vorschlagen, dass Sie als Spalte Aliase ganzen Zahlen überdenken. Sieht aus als wäre es verwirrend. . . oder schlimmer, um Fehler schwer zu erkennen.

Beachten Sie auch, dass max() funktioniert, weil 'y' > 'n'. Es gibt andere Methoden, wenn Sie nicht davon abhängen wollen.

Dies setzt auch voraus, dass Sie für jede Spalte eine Zusammenfassungszeile wünschen. Sonst möchten Sie vielleicht etwas wie group_concat().

+0

danke, gibt es einen anderen weg ohne aggregate func? – tyty

+0

@tyty. . . Sie haben eine Aggregationsabfrage. Aggregationsfunktionen sind angemessen. –

+0

habe ich bereits die Bedingungen korrigiert. Entschuldigung – tyty

0

nicht sicher, warum Sie nicht ohne max verwenden Funktion max, möchte ich glaube, Sie es wie folgt tun:

SELECT 
    u.id, u.name, 
    CASE WHEN LOCATE('0', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `0`, 
    CASE WHEN LOCATE('1', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `1`, 
    CASE WHEN LOCATE('2', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `2`, 
    CASE WHEN LOCATE('3', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `3`, 
    CASE WHEN LOCATE('4', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `4`, 
    CASE WHEN LOCATE('5', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `5`, 
    CASE WHEN LOCATE('6', GROUP_CONCAT(f.finger) THEN 'y' ELSE 'n' END `6` 
FROM USER u 
LEFT JOIN user_fingerprint f ON u.id = f.user_id 
GROUP BY u.id 

GROUP_CONCAT werden alle finger für jeden user verketten und durch Komma getrennt, dann LOCATE gibt den Index des ersten Parameters im zweiten Parameter zurück.

+0

vielen Dank! – tyty