2017-02-27 2 views
0

Ich habe zwei Tabellen, Benutzer und Umfrage. Ich möchte den Tabellenbenutzer abfragen und der Tabellenübersicht so beitreten, dass nur der Umfragedatensatz mit dem niedrigsten Wert für jeden Datensatz in der Benutzertabelle zurückgegeben wird. Ich möchte Unterabfragen und temporäre Tabellen vermeiden.Beitreten Aufzeichnungen mit dem niedrigsten Wert

Tabelle Benutzer:

-------------- 
| uid | name | 
-------------- 
| 1 | mike | 
| 2 | john | 
| 3 | bill | 
-------------- 

Tabelle Umfrage:

---------------------- 
| id | uid | value | 
---------------------- 
| 1 | 3 | 9  | 
| 2 | 3 | 5  | 
| 3 | 1 | 3  | 
| 4 | 1 | 7  | 
| 5 | 1 | 2  | 
| 6 | 2 | 4  | 
| 7 | 2 | 9  | 
| 8 | 1 | 0  | 
| 9 | 2 | 5  | 
--------------------- 

erwartete Ausgabe:

--------------------- 
| id | name | value | 
--------------------- 
| 8 | mike | 0  | 
| 2 | bill | 5  | 
| 6 | john | 4  | 
--------------------- 

Welche Art von JOIN soll ich tun, oder wie soll ich die Abfrage schreiben?

+2

Ich würde eine Unterabfrage verwenden, um die gewünschten Datensätze aus der Umfragetabelle zurückzugeben und diese mit der Benutzertabelle –

+0

zu verbinden. Die Tabelle kann bis zu einer Million Datensätze enthalten. Wäre eine Unterabfrage nicht sehr langsam? – JoeBateMuma

+0

Das hängt wahrscheinlich davon ab, welche Indizes vorhanden sind und die Datenbankserverspezifikation –

Antwort

0

Die folgende Abfrage wird alle Zeilen mit Minimalwert (keine weitere Umfrage mit einem Wert unter dem gewählten Wert existieren)

Try this:

SELECT u.*, s.value 
FROM survey s 
JOIN users u 
    ON s.uid = u.uid 
WHERE NOT EXISTS(
    SELECT 'maximum' 
    FROM survey s2 
    WHERE s2.uid = s.uid 
    AND s2.value < s.value) 
0

Sie so etwas wie dies nutzen könnten:

select s.id, u.name, y.min_value 
    from 
    (
     select uid, min(value) as min_value 
     from survey 
     group by uid 
    ) y 
    join survey s 
     on s.value = y.min_value 
     and s.uid = y.uid 
    join user u 
     on u.uid = y.uid 
0

ich denke, das Ihnen helfen wird,

SELECT * FROM SURVEY S 
INNER JOIN USERS U 
ON S.UID=U.UID 
QUALIFY ROW_NUMBER() OVER (PARTITION BY S.UID ORDER BY S.VALUE1 ASC)=1; 
+0

Die Frage bezieht sich auf MySQL. Dies sieht überhaupt nicht wie MySQL aus. – Pang

+0

SEL Haupt. ID, main.UID, main.VALUE1 FROM ( SEL S.ID, S.UID, S.VALUE1, COUNT (*) AS ROW_NUMBERS FROM SURVEY S INNER JOIN SURVEY B ON S.UID B.UID = UND S.VALUE1> = B.VALUE1 GROUP BY S.ID, S.UID, S.VALUE1) Haupt INNER JOIN USERS U ON main.UID = u.UID UND ROW_NUMBERS = 1 Bitte bezeichnete es als beantwortet – user2466009

Verwandte Themen