Question

J'ai écrit une application de test psychologique dans laquelle une liste de mots est présentée à l'utilisateur. Il / elle doit choisir dix mots qui se décrivent beaucoup , puis choisir des mots partiellement se décrire et des mots qui ne se décrivent pas. L’application elle-même fonctionne bien, mais j’étais intéressée par l’exploration des possibilités de métadonnées: quels mots ont été choisis le plus souvent dans la première catégorie et quels mots n’ont jamais été choisis dans la première catégorie. La première requête n'était pas un problème, mais la seconde (dont les mots n'ont jamais été choisis) me laisse perplexe.

La structure de la table est la suivante:

table words: id, name
table choices: pid (person id), wid (word id), class (value between 1-6)

On peut supposer que la réponse implique une jonction gauche entre mots et choix, mais il doit exister une instruction de modification - où choix.class = 1 - et cela me pose problème. Écrire quelque chose comme

select words.name
from words left join choices
on words.id = choices.wid
where choices.class = 1
and choices.pid = null

force le gestionnaire de base de données à faire un long voyage sans nulle part. J'utilise Delphi 7 et Firebird 1.5.

TIA, No'am

Était-ce utile?

La solution

Peut-être que c'est un peu plus rapide:

SELECT w.name
FROM words w
WHERE NOT EXISTS
   (SELECT 1
    FROM choices c 
    WHERE c.class = 1 and c.wid = w.id)

Autres conseils

Quelque chose comme ça devrait faire l'affaire:

SELECT name
FROM words
WHERE id NOT IN
   (SELECT DISTINCT wid   -- DISTINCT is actually redundant
    FROM choices 
    WHERE class == 1)
SELECT words.name
FROM
    words
    LEFT JOIN choices ON words.id = choices.wid AND choices.class = 1
WHERE choices.pid IS NULL

Assurez-vous de disposer d'un index sur les choix (classe, wid) .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top