[MYSQL] max van verschillende tabellen

Pagina: 1
Acties:

  • rmfloris
  • Registratie: Maart 2002
  • Laatst online: 22-11-2024

rmfloris

Kowalski: Kaboeeem??

Topicstarter
Ik heb meerdere tabellen waar de datum wordt bijgehouden wanneer er een update heeft plaatst gevonden. Nu haal ik al deze datums op via een query en gebruik ik PHP om de maximale waarde te bepalen.

Nu vroeg ik mij alleen af of dit de meest optimale oplossing is. Dus ik ben aan het stoeien gegaan om dezelfde uitkomst te krijgen via mysql (max). Wat ik nu heb (met slechts 2 tabellen in het voorbeeld)

SQL:
1
2
SELECT MAX(e.datum), MAX(n.datum) 
FROM ervaring e, nieuws n


Bovenstaande werkt natuurlijk perfect en via PHP kan je mooi de hoogste waardes van deze twee vinden.

Nu probeer ik eigenlijk een tweede query over bovenstaande query heen te leggen zodat hij de maximale waarde hiervan weer selecteerd en een uitkomst geeft. Hier loop ik alleen vast. Bijvoorbeeld het volgende werkt niet:

SQL:
1
2
3
SELECT MAX( 
SELECT MAX(e.datum), MAX(n.datum) 
FROM ervaring e, nieuws n)


Twee vragen eigenlijk:
1) Is het mogelijk?
2) Welke richting moet ik in gaan denken?

Foto afdrukken prijsvergelijk -> http://www.fotovergelijk.nl


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 18-08 21:31
Als je FROM a,b doet dan zal MySQL waarschijnlijk intern een crossproduct maken voordat de maxima berekent worden, als je tabellen wat groter worden dan zal dat tot performance problemen leiden.

MAX werkt over een kolom niet over een rij. Je kunt dus twee dingen doen, met UNION de twee resultaten in een kolom krijgen (is je potentiële performance probleem ook meteen weg) of een vergelijking met CASE WHEN a>b THEN a ELSE b END.

  • OnTracK
  • Registratie: Oktober 2002
  • Nu online
Voor de buitenste zoek je volgens mij GREATEST(value1, value2, ...), en niet MAX(expr). De eerste is een vergelijking tussen geselecteerde waarden, de tweede gaat over een aggregrate functie die werkt over een kolom, zoals _js_ boven mij al aangeeft.

[ Voor 90% gewijzigd door OnTracK op 12-09-2009 14:24 ]

Not everybody wins, and certainly not everybody wins all the time.
But once you get into your boat, push off and tie into your shoes.
Then you have indeed won far more than those who have never tried.


  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

rmfloris schreef op zaterdag 12 september 2009 @ 14:07:
Twee vragen eigenlijk:
1) Is het mogelijk?
2) Welke richting moet ik in gaan denken?
Het kan met een subquery met een union, maar het is een beetje een zooitje:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT 
    MAX(t.max) 
from ( 
       (select max(x) as max from foo) 
   union 
       (select max(x) as max from bar)
   union
       (select max(x) as max from baz)
   ...
) as t


Afhankelijk van je doel en de verdere datastructuur ben je waarschijnlijk beter af met een wijziging aan je datamodel. Een losse tabel met last_modified_time, die bij iedere update aan een onderdeel van de structuur geupdate wordt voor de betreffende rij(en)?

[ Voor 18% gewijzigd door Confusion op 12-09-2009 17:47 ]

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

Verwijderd

Confusion schreef op zaterdag 12 september 2009 @ 17:44:
[...]

Het kan met een subquery met een union, maar het is een beetje een zooitje:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT 
    MAX(t.max) 
from ( 
       (select max(x) as max from foo) 
   union 
       (select max(x) as max from bar)
   union
       (select max(x) as max from baz)
   ...
) as t


Afhankelijk van je doel en de verdere datastructuur ben je waarschijnlijk beter af met een wijziging aan je datamodel. Een losse tabel met last_modified_time, die bij iedere update aan een onderdeel van de structuur geupdate wordt voor de betreffende rij(en)?
Je hoeft natuurlijk maar één keer een MAX uit te voeren; maakt je query weer wat overzichtelijker:

SQL:
1
2
3
4
5
6
7
8
9
10
SELECT 
    MAX(x) 
from ( 
       (select x from foo) 
   union 
       (select x from bar)
   union
       (select x from baz)
   ...
) as t

Acties:
  • 0 Henk 'm!

  • Confusion
  • Registratie: April 2001
  • Laatst online: 01-03-2024

Confusion

Fallen from grace

Verwijderd schreef op maandag 14 september 2009 @ 10:27:
[...]


Je hoeft natuurlijk maar één keer een MAX uit te voeren; maakt je query weer wat overzichtelijker:

SQL:
1
2
3
4
5
6
7
8
9
10
SELECT 
    MAX(x) 
from ( 
       (select x from foo) 
   union 
       (select x from bar)
   union
       (select x from baz)
   ...
) as t
Alleen kunnen de subqueries van een eventuele index gebruikmaken (dat kunnen subqueries in MySql toch ook?); dat kan de buitenste query sowieso niet. Afhankelijk van het aantal records in foo, bar en baz kan dat een behoorlijk showstopper zijn.

Wie trösten wir uns, die Mörder aller Mörder?


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Confusion schreef op zaterdag 12 september 2009 @ 17:44:
SQL:
1
2
3
4
5
6
7
8
9
10
SELECT 
    MAX(t.max) 
from ( 
       (select max(x) as max from foo) 
   union 
       (select max(x) as max from bar)
   union
       (select max(x) as max from baz)
   ...
) as t
Waarom niet doen wat OnTracK voorstelt? ;)
SQL:
1
2
3
4
5
6
7
SELECT 
    greatest(
       (select max(x) from foo),
       (select max(x) from bar),
       (select max(x) from baz),
       ...
    );

Verder vraag ik me ook af of het datamodel wel goed is... :)

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten

Pagina: 1