webForumDet fria alternativet

Sorteringsproblem

1 svar · 269 visningar · startad av Ramzeus

RamzeusMedlem sedan mars 200640 inlägg
#1

Jag håller på med en SQL-fråga som ska hämta ut ett antal maskiner (bilar, mopeder, mfl) från en tabell. Dessa ska sedan matchas med en ägare och listas i en tabell.

Ungefär så här:

Namn            Nuvarande ägare 
NAO 903         Nisse
KEO 876         Olle
APA 123         Jörgen

Jag har tre tabeller; en maskintabell, en ägartabell och en relationstabell.
Relationstabellen innehåller förutom en relation till de vardera ägar- och maskintabellerna även ett start- och slutdatum för ägandet.
Min SQL-fråga ser ut så här:

SELECT 
	IFNULL(m.reg_nr, IFNULL(m.chassis_nr, IFNULL(m.serial_code, null))) AS name, 
	m.object_type, m.model, m.manufacturer, m.description, c.name AS current_owner, m.id
FROM machines m
LEFT JOIN machine_owners mo ON mo.machine_id=m.id AND mo.dt_end IS NULL
LEFT JOIN customers c ON c.id=mo.customer_id
GROUP BY m.id
ORDER BY name

Jag definerar en ägare som en relation med ett startdatum men inget slutdatum.

SQL-frågan fungerar prima i de flesta fall, men i vissa fall så kan det hända att det finns två ägare utan slutdatum (dt_end) i relationstabellen (handhavandefel t.ex). I så fall vill jag ha fram den senaste ägaren som finns med i relationen. I mitt fall får jag bara fram den första. Jag vill alltså i första hand ha fram den ägare som har senaste startdatumet (dt_start) och om det finns två med samma startdatum så ska den välja den med högst ID-nummer.

Hur kan jag göra för att lyckas med detta?

Jag använder MySQL 5.0

LarsGMedlem sedan dec. 200012 465 inlägg
#2
SELECT 
	coalesce(m.reg_nr, m.chassis_nr, m.serial_code) AS name, 
	m.object_type, 
        m.model, 
        m.manufacturer, 
        m.description, 
        c.name AS current_owner, 
        m.id
   FROM machines m
   JOIN machine_owners mo ON mo.machine_id=m.id 
   JOIN customers c ON c.id=mo.customer_id
 where mo.dt_start in
      (select max(dt_start)
         from machine_owners
        where machine_owners.machine_id=m.id)
   and mo.dt_end is null
ORDER BY name
Genererad på 370 ms · cache AV · v20260730165559-full.f96bc7eb