Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Recherche d'elements n'existant pas

6 réponses
Avatar
jeremie fouche
Bonsoir

Je suis en train de faire une appli qui gere (?) les activités que je
fais dans la journée. En gros, toutes les 2 heures, elle me demande ce
que je fais (car à la fin du mois, je ne m'en rappelle plus).
Je me suis basé sur SQLite.
Je me suis donc créé une table :
create table if not exists activities (
id integer primary key autoincrement,
date text,
time text,
activity text,
unique(date, time)
)

je souhaiterai savoir les dates comprises entre la date min rentrée, et
la derniere date rentrée, qui ne seraient pas dans la table.
Plus précisement, je souhaiterai savoir l'ensemble des date entre la
date min et aujourd'hui qui n'auraient pas 4 enregistrements (4
enregistrements par date = 1 journée). Aujourd'hui, seules celles
n'existant pas me posent probleme.

1 - Est ce possible ?
2 - Peut etre que la structure de ma base n'est pas du tout conçu
correctement, ce qui ne me surprendrai pas, vu mes (in)competences dans
ce domaine.

Avez vous des idées ?
Merci
--
Jérémie

6 réponses

Avatar
Eric Rossé
Le Thu, 24 Apr 2008 19:21:06 +0200, jeremie fouche écrivait:

Bonsoir

Je suis en train de faire une appli qui gere (?) les activités que je
fais dans la journée. En gros, toutes les 2 heures, elle me demande ce
que je fais (car à la fin du mois, je ne m'en rappelle plus).
Je me suis basé sur SQLite.
Je me suis donc créé une table :
create table if not exists activities (
id integer primary key autoincrement,
date text,
time text,
activity text,
unique(date, time)
)



euh, quel est le nom de la table exactement ?
pourquoi utiliser pour date et time des types "text" et non
"date" et "time", respectivement ?
évite d'utiliser "date" et "time" comme nom de champs qui
sont des mots réservés ; prefère s'y date_act, time_act,
par exemple. De façon général, pas de blancs, de lettres
accentuées ou de mots réservés dans les noms d'identifiants ;
la syntaxe s'en trouverait inutilement complexifiée...

je souhaiterai savoir les dates comprises entre la date min rentrée, et
la derniere date rentrée, qui ne seraient pas dans la table.
Plus précisement, je souhaiterai savoir l'ensemble des date entre la
date min et aujourd'hui qui n'auraient pas 4 enregistrements (4
enregistrements par date = 1 journée). Aujourd'hui, seules celles
n'existant pas me posent probleme.



select count(*), date_act from activities
group by date_act
having count(*) ^= 4
Avatar
Eric Rossé
Le Thu, 24 Apr 2008 19:21:06 +0200, jeremie fouche écrivait:

Je suis en train de faire une appli qui gere (?) les activités que je
fais dans la journée. En gros, toutes les 2 heures, elle me demande ce
que je fais (car à la fin du mois, je ne m'en rappelle plus).
Je me suis basé sur SQLite.
Je me suis donc créé une table :
create table if not exists activities (
id integer primary key autoincrement,
date text,
time text,
activity text,
unique(date, time)
)



euh, quel est le nom de la table exactement ?

Pourquoi utiliser pour date et time des types "text" et non
"date" et "time", respectivement ?
Evite d'utiliser "date" et "time" comme nom de champs qui
sont des mots réservés ; prefère s'y date_act, time_act,
par exemple.
De façon générale, pas de blancs, de lettres accentuées
ou de mots réservés dans les noms d'identifiants ; la
syntaxe s'en trouverait inutilement complexifiée...

je souhaiterai savoir les dates comprises entre la date min rentrée, et
la derniere date rentrée, qui ne seraient pas dans la table.
Plus précisement, je souhaiterai savoir l'ensemble des date entre la
date min et aujourd'hui qui n'auraient pas 4 enregistrements (4
enregistrements par date = 1 journée). Aujourd'hui, seules celles
n'existant pas me posent probleme.



select count(*), date_act from activities
group by date_act
having count(*) ^= 4
Avatar
jeremie fouche
On Apr 25, 5:43 am, Eric Rossé wrote:
Le Thu, 24 Apr 2008 19:21:06 +0200, jeremie fouche écrivait:

>Bonsoir

>Je suis en train de faire une appli qui gere (?) les activités que je
>fais dans la journée. En gros, toutes les 2 heures, elle me demande ce
>que je fais (car à la fin du mois, je ne m'en rappelle plus).
>Je me suis basé sur SQLite.
>Je me suis donc créé une table :
>create table if not exists activities (
> id integer primary key autoincrement,
> date text,
> time text,
> activity text,
> unique(date, time)
>)

euh, quel est le nom de la table exactement ?



activities, c'est dans la requete de création de la table plus haut.

pourquoi utiliser pour date et time des types "text" et non
"date" et "time", respectivement ?



Parce que SQLite ne gere pas les types date et time. En fait, je viens
de faire des essais, et les types date et time sont acceptés, mais on
peut bien mettre ce que l'on veut dans les champs date te time ! Pas
terrible.

évite d'utiliser "date" et "time" comme nom de champs qui
sont des mots réservés ; prefère s'y date_act, time_act,
par exemple. De façon général, pas de blancs, de lettres
accentuées ou de mots réservés dans les noms d'identifiants ;
la syntaxe s'en trouverait inutilement complexifiée...



OK

>je souhaiterai savoir les dates comprises entre la date min rentrée, et
>la derniere date rentrée, qui ne seraient pas dans la table.
>Plus précisement, je souhaiterai savoir l'ensemble des date entre la
>date min et aujourd'hui qui n'auraient pas 4 enregistrements (4
>enregistrements par date = 1 journée). Aujourd'hui, seules celles
>n'existant pas me posent probleme.

select count(*), date_act from activities
group by date_act
having count(*) ^= 4



Heuuu, oui mais non. J'ai déjà la requete que tu proposes, elle permet
uniquement de recuperer les dates déjà dans la table qui contiennent de
1 à 3 elements, mais pas 0. Je me doute que ce que je demande est
completement impossible en SQL pur et dur, car, comme ecrit dans le
titre, je souhaite recupérer des éléments n'existant pas du tout dans la
table. C'est pourquoi je mettais en doute la conception de ma base pour
résoudre ce genre de probleme. Car aujourd'hui, je ne vois que
l'application cliente qui puisse répondre à cette question.
--
Jérémie
Avatar
jeremie fouche
On Apr 25, 5:43 am, Eric Rossé wrote:
Le Thu, 24 Apr 2008 19:21:06 +0200, jeremie fouche écrivait:

>Bonsoir

>Je suis en train de faire une appli qui gere (?) les activités que je
>fais dans la journée. En gros, toutes les 2 heures, elle me demande ce
>que je fais (car à la fin du mois, je ne m'en rappelle plus).
>Je me suis basé sur SQLite.
>Je me suis donc créé une table :
>create table if not exists activities (
> id integer primary key autoincrement,
> date text,
> time text,
> activity text,
> unique(date, time)
>)

euh, quel est le nom de la table exactement ?



activities, c'est dans la requete de création de la table plus haut.

pourquoi utiliser pour date et time des types "text" et non
"date" et "time", respectivement ?



Parce que SQLite ne gere pas les types date et time. En fait, je viens
de faire des essais, et les types date et time sont acceptés, mais on
peut bien mettre ce que l'on veut dans les champs date te time ! Pas
terrible.

évite d'utiliser "date" et "time" comme nom de champs qui
sont des mots réservés ; prefère s'y date_act, time_act,
par exemple. De façon général, pas de blancs, de lettres
accentuées ou de mots réservés dans les noms d'identifiants ;
la syntaxe s'en trouverait inutilement complexifiée...



OK

>je souhaiterai savoir les dates comprises entre la date min rentrée, et
>la derniere date rentrée, qui ne seraient pas dans la table.
>Plus précisement, je souhaiterai savoir l'ensemble des date entre la
>date min et aujourd'hui qui n'auraient pas 4 enregistrements (4
>enregistrements par date = 1 journée). Aujourd'hui, seules celles
>n'existant pas me posent probleme.

select count(*), date_act from activities
group by date_act
having count(*) ^= 4



Heuuu, oui mais non. J'ai déjà la requete que tu proposes, elle permet
uniquement de recuperer les dates déjà dans la table qui contiennent de
1 à 3 elements, mais pas 0. Je me doute que ce que je demande est
completement impossible en SQL pur et dur, car, comme ecrit dans le
titre, je souhaite recupérer des éléments n'existant pas du tout dans la
table. C'est pourquoi je mettais en doute la conception de ma base pour
résoudre ce genre de probleme. Car aujourd'hui, je ne vois que
l'application cliente qui puisse répondre à cette question.
--
Jérémie
Avatar
jeremie fouche
On Apr 25, 5:43 am, Eric Rossé wrote:
Le Thu, 24 Apr 2008 19:21:06 +0200, jeremie fouche écrivait:

>Bonsoir

>Je suis en train de faire une appli qui gere (?) les activités que je
>fais dans la journée. En gros, toutes les 2 heures, elle me demande ce
>que je fais (car à la fin du mois, je ne m'en rappelle plus).
>Je me suis basé sur SQLite.
>Je me suis donc créé une table :
>create table if not exists activities (
> id integer primary key autoincrement,
> date text,
> time text,
> activity text,
> unique(date, time)
>)

euh, quel est le nom de la table exactement ?



activities, c'est dans la requete de création de la table plus haut.

pourquoi utiliser pour date et time des types "text" et non
"date" et "time", respectivement ?



Parce que SQLite ne gere pas les types date et time. En fait, je viens
de faire des essais, et les types date et time sont acceptés, mais on
peut bien mettre ce que l'on veut dans les champs date te time ! Pas
terrible.

évite d'utiliser "date" et "time" comme nom de champs qui
sont des mots réservés ; prefère s'y date_act, time_act,
par exemple. De façon général, pas de blancs, de lettres
accentuées ou de mots réservés dans les noms d'identifiants ;
la syntaxe s'en trouverait inutilement complexifiée...



OK

>je souhaiterai savoir les dates comprises entre la date min rentrée, et
>la derniere date rentrée, qui ne seraient pas dans la table.
>Plus précisement, je souhaiterai savoir l'ensemble des date entre la
>date min et aujourd'hui qui n'auraient pas 4 enregistrements (4
>enregistrements par date = 1 journée). Aujourd'hui, seules celles
>n'existant pas me posent probleme.

select count(*), date_act from activities
group by date_act
having count(*) ^= 4



Heuuu, oui mais non. J'ai déjà la requete que tu proposes, elle permet
uniquement de recuperer les dates déjà dans la table qui contiennent de
1 à 3 elements, mais pas 0. Je me doute que ce que je demande est
completement impossible en SQL pur et dur, car, comme ecrit dans le
titre, je souhaite recupérer des éléments n'existant pas du tout dans la
table. C'est pourquoi je mettais en doute la conception de ma base pour
résoudre ce genre de probleme. Car aujourd'hui, je ne vois que
l'application cliente qui puisse répondre à cette question.
--
Jérémie
Avatar
Jogo
Sur fr.comp.applications.sgbd, jeremie fouche disait :

> select count(*), date_act from activities
> group by date_act
> having count(*) ^= 4

Heuuu, oui mais non. J'ai déjà la requete que tu proposes, elle permet
uniquement de recuperer les dates déjà dans la table qui contiennent de
1 à 3 elements, mais pas 0. Je me doute que ce que je demande est
completement impossible en SQL pur et dur, car, comme ecrit dans le
titre, je souhaite recupérer des éléments n'existant pas du tout dans la
table. C'est pourquoi je mettais en doute la conception de ma base pour
résoudre ce genre de probleme. Car aujourd'hui, je ne vois que
l'application cliente qui puisse répondre à cette question.



En effet en SQL on ne peut pas retourner des valeurs qui n'existent
pas. La solution canonique à ce genre de problème est de créer une
table avec toutes les données possibles. Dans ton cas il faudrait donc
créer une table all_dates avec un seul champs val (je suis pas fort
pour les noms). Ensuite on ajoute toutes les dates nécessaires dans
cette table et on se retrouve avec une requête du genre :

SELECT val
FROM all_dates
WHERE val NOT IN (
SELECT date_act
FROM activities
GROUP BY date_act
HAVING count(*) = 4
)

Il est fort possible qu'une solution coté client soit plus rentable.

--
Lorsque l'on a exclu de l'art le but de moraliser et d'améliorer les
hommes, il ne s'en suit pas encore que l'art doive être absolument
sans fin, sans but et dépourvu de sens, en un mot, l'art pour l'art.
-- Nietzsche