我写了一个心理测试应用程序,其中向用户提供了一个单词列表,并且他/她必须选择非常描述自己的十个单词,然后选择部分单词形容自己,以及不描述自己的话语。应用程序本身工作正常,但我有兴趣探索元数据的可能性:第一类中最常选择的单词,以及第一类中从未选择过哪些单词。第一个查询不是问题,但第二个(从未选择过的单词)让我感到难过。

表结构如下:

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

据推测,答案涉及单词和选择之间的左连接,但必须有一个修改语句 - 其中choices.class = 1 - 这导致了我的问题。写点像

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

导致数据库管理员长途跋涉。我使用的是Delphi 7和Firebird 1.5。

TIA, No'am

有帮助吗?

解决方案

也许这有点快:

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

其他提示

这样的事情可以解决问题:

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

确保您有选项(class,wid)的索引。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top