Frage

Ich habe eine psychologische Testanwendung geschrieben, in dem der Benutzer eine Liste von Wörtern dargestellt wird, und er / sie hat zehn Worte zu wählen, die sehr beschreiben sich selbst, dann Worte wählen, welche teilweise beschreiben sich selbst, und Worte, die sich nicht beschreiben. Die Anwendung selbst funktioniert gut, aber ich war daran interessiert, die Meta-Daten Möglichkeiten zu erforschen: Welche Worte in der ersten Kategorie am häufigsten ausgewählt wurden, und welche Worte sind nie in der ersten Kategorie gewählt. Die erste Abfrage war kein Problem, aber die zweiten Blätter (die Worte sind nie gewählt worden ist) ich ratlos.

Die Tabellenstruktur ist wie folgt:

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

Vermutlich beinhaltet die Antwort ein linke zwischen Worten und Entscheidungen kommen, aber es hat eine modifizierende Anweisung sein - wo choices.class = 1 - und das mir Probleme verursacht. Schreiben so etwas wie

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

bewirkt, dass der Datenbankmanager auf einer langen Reise gehen nirgendwo hin. Ich bin mit Delphi 7 und Firebird 1.5.

TIA, No'am

War es hilfreich?

Lösung

Vielleicht ist das ein bisschen schneller:

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

Andere Tipps

So etwas sollte es tun:

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

Stellen Sie sicher, dass Sie einen Index für choices (class, wid) haben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top