[MySQL] Aufgabe - unlösbares Problem?

hex-master

Grünschnabel
Halli hallo liebe User,
ich bin der hex-master und nachdem ich euch jetzt mit der bewusst provokaten Überschrift gelockt habe, wird mir hoffentlich jemand helfen können, da ich langsam echt verzweifel.

Folgendes Problem:
Es geht um eine Aufgabe, die mir gestellt worden ist:

Code:
There is a table: animals (name, owner, species, sex, birth and death)

Construct a SELECT Query that will show the name and the age of all cats and dogs on 10.10.2010 descending from oldest to the youngest.
The age must be in years e.g. Olga would be listed in the table as 3.5452 years old and also give me the dead ones. Dead animals don't get older, or do they?

"Select * from animals" sieht so aus: (name | owner | species | sex | birth | death)

Fluffy | John | cat | m |2010-03-22 |2011-07-20
Demie| James | Dolphin | f |2011-11-23 |2012-07-18
Dexter | Julia| Dog | m |2009-04-13| 2012-11-04
Olga | Old olga | cat | f| 2006-10-11 |2010-04-27
Rain | Michelle | Cat| f| 2006-01-10 |2012-11-23
Igloo | Susie | whale| m| 2002-04-04| 2008-11-25

Wie man dem Text entnehmen kann, habe ich eine Tabelle (animals) und die darin enthaltenen Spalten "name, owner...".
Jetzt soll ich einen Select-Query formulieren, der mir die Namen aller Hunde und Katzen und das Alter (in Jahren mit Dezimalstellen) anzeigt.

Bis jetzt bin ich bis hierhin gekommen:
Code:
SELECT name, DATEDIFF(death, birth)/365 AS age FROM animals WHERE species='cat' or species='dog' ORDER BY age DESC

Das Zeigt mir die Namen und das Alter auch richtig an, aber was soll ich mit dem Abschnitt
Code:
"...give me the dead ones. Dead animals don't get older, or do they?"
aus der Frage anfangen?

Wäre nett, wenn mir jemand helfen kann.
Euer hex-master
 
Zuletzt bearbeitet:
Du sollst ja das Alter am 10.10.2010 berechnen. Da gibts einige Viecher die bereits Tod sind, andere die erst später vor die Hunde gehen.
Wenn jetzt ein Hund vor dem 10.10.2010 gestorben ist, dann hat er das alter bis zum Tode, nicht bis 10.10.2010. Das kannst du einfach mit einem MIN() lösen

Das ist de Logik (Vorsicht, nur die Logik, kein MySQL-Code!)
Code:
age = MIN('10.10.2010', death) - birth

Natürlich musst du auch noch prüfen, ob das Viech am 10.10.2010 bereits geboren ist
 
Okey - so weit so gut, verstanden ist es mal.

Aber ich bekomme deinen Tipp beim besten Willen einfach nicht in mein SELECT eingebaut.
In der Zwischenzeit bin ich jetzt zu dem Query
SQL:
SELECT name, DATEDIFF('2010-10-10', birth)/365 AS age FROM animals WHERE species='cat' OR species='dog' ORDER BY age DESC
gekommen, der gibt mir dann die Namen/das Alter von den 3 Viechern die noch Leben zum Zeitpunkt 2010-10-10 aus - nur leider wird Olga einfach bis zu diesem Zeitpunkt als lebend gerechnet und dementsprechend das Alter zu hoch ausgegeben.
Wenn es Dir nicht zu viel Arbeit machst, kannst du mir das Query posten?

Vielen Dank schonmal im voraus,
hex-master
 
Zuletzt bearbeitet von einem Moderator:
So spät am Abend soll ich noch deine Hausaufgaben lösen?

MIN() musst du einbauen.
SQL:
SELECT 
	name, 
	-- Hier das MIN() einsetzen
	DATEDIFF(MIN('2010-10-10', death), birth)/365 AS age 
FROM 
	animals 
WHERE 
	-- und sicherstellen dass keine noch-nicht-geborene ausschliessen
	birth <= '2010-10-10'
	-- Anstelle OR das IN() verwenden
	AND species IN ('cat', 'dog')
ORDER BY
	age DESC
 
Ich möchte nur anmerken, dass die Variante mit DATE_DIFF() ungenau ist, da sie keine Rücksicht auf Schaltjahre nimmt. Allerdings wüsste ich ad hoc auch nicht, wie man dieses Problem elegant löst. Daher bloß eine Anmerkung, über die man mal nachdenken könnte.
 
So genau muss es nicht sein, das hatte ich schonmal gefragt und man hat mir gesagt, dass man die Schaltjahre getrost ignorieren kann.
Und ein richtig dickes Danke an Yaslaw für die Hilfe und alles.

Edit:
"1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ' death), birth)/365 As age FROM animals WHERE birth <= '2010-10-10' AND species ' at line 1"

Irgendwas wird wohl noch nicht gehen... und es wird irgendwo am MIN liegen...

hex-master
 
Zuletzt bearbeitet:
Hi,

wenn mich nicht alles täuscht wird MIN für GROUP Funktionen verwendet um eine Spalte zusammenzufassen.
Eine andere Möglichkeit wäre es die IF funkton zu nutzen

Code:
SELECT 
    name, 
    -- Hier das MIN() einsetzen
    DATEDIFF(IF('2010-10-10' < death,'2010-10-10', death), birth)/365 AS age 
FROM 
    animals 
WHERE 
    -- und sicherstellen dass keine noch-nicht-geborene ausschliessen
    birth <= '2010-10-10'
    -- Anstelle OR das IN() verwenden
    AND species IN ('cat', 'dog')
ORDER BY
    age DESC
 
Moin,

auch nur als Anmerkung bzw. Ergänzung zu Nino14:

Ja, MIN() und MAX() sind nur als Aggregatfunktionen zulässig in mySQL (also mit GROUP BY).

Das Minimum bzw Maximum von einzeln angegebenen Feldern/Werten liefern die weniger bekannten Funktionen GREATEST() und LEAST()


Damit könnte die Lösung auch sein:
SQL:
SELECT 
    name, 
    -- Hier das LEAST() einsetzen
    DATEDIFF(LEAST('2010-10-10' ,death), birth)/365 AS age 
FROM 
    animals 
WHERE 
... (s.o.)
   species IN ('cat', 'dog')
ORDER BY
    age DESC

Grüße
Biber
 
du hast noch ein problem wenn das tier noch am leben ist (death = null). also zusätzlich noch coalesce:

SQL:
select 
  name,
  datediff(coalesce(least('2010-10-10' ,death),'2010-10-10'), birth)/365 as age
from 
  animals
where
  species in ('cat','dog')
  and
  birth <= '2010-10-10' 
order by 
  age desc;
 
Zuletzt bearbeitet von einem Moderator:
Zurück