使用“WHERE字段< NUM”连接MySQL中的表

时间:2014-02-13 15:32:45

标签: php mysql sql join

我的数据库中有两个表需要加入。第一个是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的投票。

3 个答案:

答案 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