# Tricky SQL Query



## pulse (22. Aug 2014)

Hallo, habe eine Mail Tabelle mit den Feldern user_id,date_created,item_type,deleted, status,folder.

So nun möchte ich alle User wo z.B 30% der letzten 5 Mails der status='EXPIRED' ist. Habe schon Probleme damit für JEDEN User die letzten 5 Mails zu cachen. Mein Versuch bisher:

```
select  count(m.status='null')/count(*)*100  , m.user_id,MAX(m.date_created), COUNT(*) as ANZAHL from mail m inner join user u where m.user_id=u.id and m.item_type='CONTACT'   and m.deleted=false and m.folder='INBOX' m.status='EXPIRED' GROUP BY m.user_id ORDER BY m.date_created DESC
```

Geht das überhaupt solch ein Query zu erstellen? 

Für eure Hilfe schonmal Danke!


----------



## Joose (22. Aug 2014)

Ich glaube mit Subselects und JOINS kann man hier sicher etwas zaubern.

Es ist möglich das ResulSet von einem Query auf X Zeilen zu begrenzen.
-> Du kannst dir also die letzten fünf Mails eines User selektieren. (Subselect)
In MySQL wäre dieser Befehl "[DEIN QUERY] LIMIT 5"


----------



## Times (22. Aug 2014)

Probier das mal aus, dies sollte funktionieren.. (Evtl. hab ich deine Spaltennamen ein wenig falsch geschrieben)

```
SELECT mail.user_id, mail.date_created, mail.status, L1.countExpiredOfLastFive 
FROM mail
LEFT JOIN (
			SELECT Count(*) AS countExpiredOfLastFive, F1.user_id
			FROM (
				SELECT *
				FROM mail
				WHERE mail.status = 'EXPIRED'
				LIMIT 5
			) AS F1
			GROUP BY user_id
			ORDER BY F1.date_created DESC
			) AS L1 ON mail.user_id = L1.user_id
WHERE L1.countExpiredOfLastFive >= ((5/100)*30)
GROUP BY user_id;
```

Sollte es funktionieren und du weisst nicht warum oder verstehst das Statement nicht, dann gib nochmal Bescheid.. dann schreib ich dir noch eine Erklärung dazu


----------



## pulse (22. Aug 2014)

Vielen Dank Times! Aber leider findet diese Query keinen Eintrag


----------

