【问题标题】:Left join returns zero rows左连接返回零行
【发布时间】:2012-11-15 14:01:43
【问题描述】:

我有两张桌子:

question
question_id | question

question_answer
answer_id | question_id | choice_id | user_id | explain

我想获取特定用户尚未回答的所有问题。

SELECT question, question_id as questionId 
FROM question q 
LEFT JOIN question_answer qa USING(question_id)
WHERE qa.user_id!=$userId

在这种情况下,我得到零行。我也试过了

SELECT question, q.question_id as questionId 
FROM question q 
LEFT JOIN question_answer qa ON q.question_id=qa.question_id AND qa.user_id!=$userId

显然这会返回所有记录。我卡在这里如何进行此查询。

【问题讨论】:

  • 你应该有一个额外的 JOIN 和 users 表。

标签: mysql join left-join


【解决方案1】:

LEFT JOIN 中用于检查特定用户的部分应颠倒过来,即user_id = $userId 而不是user_id <> $userId

从结果行中选择user_id IS NULL 所在的行,以查找$userId 尚未回答(尚未)的问题。

SELECT question, q.question_id as questionId 
FROM question q 
LEFT JOIN question_answer qa ON q.question_id=qa.question_id AND qa.user_id=$userId
WHERE qa.user_id IS NULL

【讨论】:

    【解决方案2】:

    如果你不是一定要使用JOIN操作那么你可以试试这个

    想要获取特定用户尚未回答的所有问题 然而:

    select * from question
    where
        question_id not in (select distinct question_id from question_answer where user_id=$userId);
    

    See the demo on Sqlfiddle

    不知道not inJOIN操作慢还是快。

    【讨论】:

      【解决方案3】:

      试试这个:

      SELECT question, q.question_id as questionId 
      FROM question q 
      LEFT JOIN question_answer qa ON q.question_id = qa.question_id 
      WHERE qa.user_id IS NULL;
      

      SQL Fiddle Demo

      这会给你没有答案的问题

      但是,如果您想获得尚未回答问题的用户,您应该在 users 表中添加一个额外的 JOIN。比如:

      SELECT u.id, u.name
      FROM  users u 
      LEFT JOIN question_answer qa ON qa.user_id = u.id
      WHERE qa.question_id IS NULL;
      

      Updated SQL Fiddle Demo

      【讨论】:

        【解决方案4】:

        我会将上面MG的答案修改为简单

        SELECT question, q.question_id as questionId 
        FROM question q 
        LEFT JOIN question_answer qa ON q.question_id = qa.question_id 
        and qa.user_id=2
        WHERE qa.user_id IS NULL;
        

        【讨论】:

        • 这基本上是我的答案:)
        • 哦,对不起。当我用上面的方法调整他的 sqlfiddle 时,它​​似乎产生了你想要的结果
        • 所以如果你去这里sqlfiddle.com/#!2/958f1/5你会看到你正在寻找一个特定的用户和他未回答的问题
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-20
        • 2017-09-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多