# MySQL Abfrage sortieren



## didi577 (27. Nov 2018)

Hallo,

ich möchte eine Abfrage rückwärts sortieren und begrenzen.

Bei dieser Abfrage funktioniert es:

```
SELECT DISTINCT company
FROM (SELECT DISTINCT company
FROM crmdb.tickets t JOIN crmdb.contacts c ON t.cid = c.id
WHERE (t.user17 = 57 OR t.user17 = 82 OR t.user17 = 83)
GROUP BY t.cid 
ORDER BY company DESC
LIMIT 10) sub
ORDER BY company
;
```

Bei dieser Abfrage jedoch nicht:

```
SELECT from_unixtime(createtime), SUM(id)
    FROM (SELECT from_unixtime(createtime), SUM(id)
        FROM crmdb.tickets o
        WHERE WEEKOFYEAR(from_unixtime(createtime)) <= 47 
        AND user26 = 'PLanung/Bewirtschaftung' 
        AND (o.status = '0' OR o.status = '1') 
        GROUP BY from_unixtime(createtime) 
        ORDER BY from_unixtime(createtime) 
        DESC LIMIT 30) AS u 
            ORDER BY from_unixtime(createtime)
;
```

Die Workbench sagt immer das Spalte "createtime" in fieldlist nicht vorhanden ist. Sie ist jedoch definitiv in der Tabelle vorhanden.

Worin liegt das Problem?

Ziel ist es die letzten 30 Datenbankeinträge nach Datum aufsteigend sortiert zu erhalten.


----------



## mihe7 (27. Nov 2018)

Naja, u ist ein Subselect, in dem Du from_unixtime(createtime) auswählst => die Spalte createtime existiert im Ergebnis des Subselects nicht mehr; gib dieser Spalte ein Alias und sortiere dann danach.

Nachtrag: oder wähle im Subselect einfach createtime statt from_unixtime(createtime) aus


----------



## mihe7 (27. Nov 2018)

didi577 hat gesagt.:


> Ziel ist es die letzten 30 Datenbankeinträge nach Datum aufsteigend sortiert zu erhalten.


Dann ist der SELECT sowieso falsch: was willst Du mit der Summe der IDs?

Sollte theoretisch doch folgendes reichen:

```
SELECT * FROM (SELECT * FROM tabelle ORDER BY createtime DESC LIMIT 30) u ORDER BY createtime;
```


----------



## didi577 (27. Nov 2018)

mihe7 hat gesagt.:


> was willst Du mit der Summe der IDs?


mit dieser Abfrage fülle ich ein BarChart in JavaFX um Tagesmengen darzustellen. Klappt auch soweit, bis auf das oben beschriebene Problem wenn ich das Ergebnis limitieren will.
Wenn ich so mache wie du beschrieben hast bleibt es dabei das er die Spalte "createtime" nicht kennt:

11:12:10    SELECT *  FROM (SELECT from_unixtime(createtime), SUM(id)   FROM crmdb.tickets o         WHERE WEEKOFYEAR(from_unixtime(createtime)) <= 47    AND user26 = 'PLanung/Bewirtschaftung'          AND (o.status = '0' OR o.status = '1')          GROUP BY from_unixtime(createtime)          ORDER BY from_unixtime(createtime)          DESC LIMIT 30) AS u     ORDER BY from_unixtime(createtime) LIMIT 30    Error Code: 1054. Unknown column 'createtime' in 'order clause'    0.000 sec

Die Spalte ist aber da !?


----------



## mihe7 (27. Nov 2018)

didi577 hat gesagt.:


> Wenn ich so mache wie du beschrieben hast bleibt es dabei das er die Spalte "createtime" nicht kennt:


Da ist nichts von dem enthalten, was ich geschrieben habe.

Probier mal (ggf. musst Du im GROUP BY noch from_unixtime(createtime) durch unix_createtime ersetzen; ist von DB zu DB unterschiedlich):

```
SELECT * FROM (SELECT from_unixtime(createtime) AS unix_createtime, SUM(id) FROM crmdb.tickets o WHERE WEEKOFYEAR(from_unixtime(createtime)) <= 47 AND user26 = 'PLanung/Bewirtschaftung' AND (o.status = '0' OR o.status = '1') GROUP BY from_unixtime(createtime) ORDER BY from_unixtime(createtime) DESC LIMIT 30) AS u ORDER BY unix_createtime;
```


----------

