我的数据库中有两个表需要加入。第一个是words
,第二个是votes
。表words
包含英语单词,表votes
表示单词翻译的投票。每次这样的投票都有“重量”字段。当普通用户投票时,新的entrie创建的权重= 1,如果admin - weight = 10。
我需要选择所有没有管理员投票的单词(只有一个查询)。
以下是我正在尝试执行的查询的简化版本
SELECT w.* FROM words AS w
LEFT JOIN votes AS v ON w.word = v.word
WHERE v.weight < 10 // help me out here
假设有投票的表格有这样的条目。
[id] [word] [translation] [weight]
1 you ты 1
2 you вы 10
3 you ваши 1
4 hello привет 1
5 hello привет 1
所以不应该选择“你”这个词,因为它有一个admin的投票。
答案 0 :(得分:3)
您可以通过where
子句中的比较来执行此操作:
SELECT w.*
FROM words w
WHERE not exists (select 1 from votes v where v.word = w.word and v.weight = 10);
即,选择所有不存在具有管理员投票记录的单词。
答案 1 :(得分:1)
根据您的数据库设置以及MySQL如何决定在您的数据库环境中解释查询,有3种替代方案的可读性和性能大不相同。
经典子查询:
SELECT w.*
FROM words w
WHERE NOT EXISTS(
SELECT 1
FROM votes v
WHERE v.word = w.word
AND v.weight = 10
)
IN()子查询:
SELECT w.*
FROM words w
WHERE w.word NOT IN(
SELECT v.word
FROM votes v
WHERE v.weight = 10
)
LEFT JOIN与IS NULL:
SELECT w.*
FROM words w
LEFT JOIN votes v
ON ( v.word = w.word
AND v.weight = 10
)
WHERE v.weight IS NULL
除非我写错字,否则所有这些都应该给出相同的结果,但具有不同的性能特征,所以我建议你全力以赴,检查哪种效果最适合你的情况。
答案 2 :(得分:0)
SELECT * FROM votes
WHERE max(weight)=1
GROUP BY word