查询用户没有得分的项目的MySQL表格'然而

时间:2016-12-18 18:38:57

标签: mysql sql database

                      Tables
 __________________       ________________________________
|______name________|     |____________scores______________|
|___id___|__name___|     |_id_|_user-id_|_name-id_|_score_|
| 1      | bob     |     | 1  | 3       | 1       | 5     |
| 2      | susan   |     | 2  | 1       | 3       | 4     |
| 3      | geoff   |     | 3  | 3       | 2       | 3     |
| 4      | larry   |     | 4  | 2       | 4       | 5     |
| 5      | peter   |     | 5  | 1       | 1       | 0     |
--------------------     ----------------------------------

我正在寻找一个从'名称'中返回RANDOM名称的查询。表,用户目前尚未得分。

所以给定的用户' 1'例如,它可以归还苏珊,拉里或彼得。作为用户' 1'还没给他们一个分数。

SELECT * 
FROM names
LEFT JOIN 
votes
ON  names.id = votes.name_id
WHERE votes.user_id = 1
AND (votes.score IS NULL);

到目前为止,我有这个,但它似乎没有像我想的那样工作 (atm它不会随机返回,但所有,但这是错误的)
任何帮助,将不胜感激。

4 个答案:

答案 0 :(得分:1)

如果要对外连接表的某些字段进行过滤,则连接类型会自动更改为内部。在你的情况下它的条件

votes.user_id = 1 

所以你需要将这个条件从WHERE移动到ON

SELECT * 
FROM names
LEFT JOIN 
votes
ON  names.id = votes.name_id and votes.user_id = 1
WHERE (votes.score IS NULL);

答案 1 :(得分:0)

您可以申请:

SELECT name FROM name join scores on name.id=scores.user_id WHERE scores.score=0

答案 2 :(得分:0)

考虑将条件从OUTER JOIN移至INNER JOIN子句,因为您执行LEFT JOIN votes ON names.id = votes.name_id AND votes.user_id = 1 WHERE votes.score IS NULL ORDER BY RAND(); 其他效果与{{1}}相同

{{1}}

答案 3 :(得分:0)

您可以将其作为子查询执行

SELECT * 
FROM names 
WHERE id NOT IN (SELECT name_id FROM votes WHERE user_id=1) 
ORDER BY RAND()
LIMIT 1