2017-09-19 5 views
0

Étant donné le tableau suivant:sqlite auto requête de jointure en utilisant max()

| id | user_id | score |  date | 
|----|---------|-------|------------| 
| 1 |  1 |  1 | 2017-08-31 | 
| 2 |  1 |  1 | 2017-09-01 | 
| 3 |  2 |  2 | 2017-09-01 | 
| 4 |  1 |  2 | 2017-09-02 | 
| 5 |  2 |  2 | 2017-09-02 | 
| 6 |  3 |  1 | 2017-09-02 | 

besoin de trouver les user_ids qui ont la note maximale pour une date donnée (il peut y avoir plus d'un), donc je suis essayer:

SELECT s1.user_id 
    FROM (
    SELECT max(score) as max, user_id, date 
    FROM scores 
) AS s2 
    INNER JOIN scores as s1 
    ON s1.date = '2017-08-31' 
    AND s1.score = s2.max 

la requête renvoie correctement pour les 2 dernières dates, mais retourne 0 enregistrements pour la première date (« 31/08/2107 »), il doit retourner le score de 1

Pourquoi gagné » t cette première date retourne correctement et/ou est il y a une façon plus élégante d'écrire cette requête?

Voici la version de la requête qui se rapproche le plus du fonctionnement, même si elle ne fonctionne pas lorsqu'il n'y a qu'une seule note de test. Je ne comprends pas comment je m'en tire de ne pas utiliser la clause GROUP BY dans l'ensemble.

SELECT s1.user_id 
    FROM (
    SELECT max(score) as max, user_id, date 
    FROM scores 
) AS s2 
    INNER JOIN scores as s1 
    ON s1.date = :date 
    AND s1.score = s2.max 

Répondre

2

Une option de requête correcte est:

SELECT user_id 
FROM scores 
WHERE score = (SELECT MAX(score) FROM scores WHERE date = '2017-08-01') 

Notez que l'un problème avec votre requête (ce qui est probablement votre problème) est que la user_id et la date dans la sous requête ne vont pas être liés à la ligne qui contient MAX (score) puisque vous n'avez pas de clause "group by" pour forcer le regroupement