2017-08-20 1 views
0

Ich muss eine Abfrage mit MAX-Anweisung anzeigen, aber ich weiß nicht wie. Ich werde mit 2 Simple-Tabellen erklären, um besser zu verstehen.sql mysql Max()

  • 1 Tabelle Familie
 
family 
------ 
id int(1) - PK 
name varchar(255) 
  • 1 Tisch Person
 
person 
------ 
id int(1) - PK 
FK_id_family - FK family(id) 
first_name varchar(255) 
age int(1) 

Inhalt der Tabellen

 
family 
------ 
1 - DUPONT 
2 - MARTIN 
3 - PETIT 
4 - DUPRES 
 
person 
------ 
1 - 1 - Jean - 70 (family DUPONT) 
2 - 1 - Jeannette - 65 (family DUPONT) 
3 - 1 - Pierre - 35 (family DUPONT) 
4 - 1 - Nicolas - 29 (family DUPONT) 
5 - 2 - Andre - 69 (family MARTIN) 
6 - 2 - Ginette - 58 (family MARTIN) 
7 - 2 - Benjamin - 25 (family MARTIN) 

Ich brauche eine Abfrage zu haben, die family.name anzuzeigen, person.first_name, person.age, wo die Person ist die ältere in der Familie und auch der Familienname, wo es nicht Person verknüpft ist. Das Ergebnis wird dieses sein.

 
DUPONT - Jean - 70 
MARTIN - Andre - 69 
PETIT - NULL - NULL 
DUPRES - NULL - NULL 

Vielen Dank für Ihre Hilfe

+0

See [Warum sollte ich eine MCVE für das, was scheint für mich eine sehr einfache SQL-Abfrage sein] (http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be -a-very-simple-sql-query) – Strawberry

Antwort

0

Zuerst die maximale age durch die Gruppierung FK_id_family persönlich Tisch bekommen müssen und es dann mit family zu verbinden. Auf diese Weise erhalten Sie name und mit höchsten age zusammen.

Jetzt müssen Sie eine Verbindung mit person Tabelle, um first_name Spalte zu bekommen. Ich habe nicht unter sql getestet. Aber ich hoffe, dies wird Ihnen die erwartete Leistung geben. von für erhalten die ältere jeder Familie und links verbinden mit anderen Tisch

select 
f.name, 
pr.first_name, 
p.age 
from family f 
inner join 
(select FK_id_family as id, MAX(age) as age from person group by FK_id_family) p on p.id=f.id 
inner join 
person pr on pr.FK_id_family=p.id 
0

Sie eine Unterabfrage mit Gruppe verwenden könnte für die Resul bekommen

select family.name, person.age, person.first_name 
    from family 
    left join (
     select FK_id_family, max(age) as older 
    from person 
    group by FK_id_family 
    ) t on family.id = t.FK_id_family 
    left join person on family.id = person.FK_id_family and t.older = person.age 
+0

könnte dies effizienter sein @scaisEdge SELECT family.name, t.age, t.first_name FROM-Familie LINKER JOIN (SELECT first_name , Alter, FK_id_family FROM Person GROUP BY person.FK_id_family HAVING MAX (Alter)) t ON family.id = t.FK_id_family –

+0

@PraveenE für die Leistungsbewertung .. muss den EXPLAIN Plan sehen .. normalerweise muss das Ergebnis gefiltert und gefiltert werden sind weniger effizient, dass verbinden .. aber .. Sie müssen den Plan sehen und und wie der Index verwenden (wenn Thera Index sind) auch IN-Klausel ist nicht effizient als Join .. auch – scaisEdge