2012-04-10 63 views
1

我想运行一个查询,选择用户未从2个独立表中回答的最新问题。这是我想出了:你如何使用mysql join来过滤整行?

SELECT Q.question_id, Q.question, S.user_id, S.question_id 
FROM questions Q inner join answers S on Q.question_id=S.question_id 
WHERE S.user_id != '$userID' 

这确实不筛选出其中用户已回答一个具体的问题,但不幸的是,如果其他用户回答同样的问题,但它仍然返回问题的行。如果用户没有回答,我想消除所有一起返回的问题。

建议/想法,欢迎,谢谢。

+1

您的措辞使得它对您要实现的内容模糊不清。你想过滤掉用户回答的问题,还是没有回答? – kittemon 2012-04-10 01:42:59

+0

你想要最新的未答复的问题吗? – 2012-04-10 02:04:56

+0

是的。我想为那个登录的用户选择最新的未答复的问题。 – user761479 2012-04-10 03:34:10

回答

2

“选择哪些没有所有问题已回答$userId“:

SELECT Q.question_id, Q.question 
FROM questions Q 
WHERE 
    Q.question_id NOT IN (
     /* Select all questions's ids, which have been answered by $userId */ 
     SELECT `question_id` 
     FROM `answer` 
     WHERE `answer`.`user_id` = '$userId' 
    ) 
+0

工程完美。非常感谢您了解我正在寻找的内容并将其分解,使其更加简单。向您致敬 – user761479 2012-04-10 04:06:44

+0

我的荣幸。 :-) – Basti 2012-04-10 04:08:25

0

也许这样?

SELECT Q.question_id, Q.question, S.user_id, S.question_id 
FROM questions Q 
JOIN answers S ON Q.question_id=S.question_id 
WHERE 
    S.user_id NOT IN (
     SELECT user_id 
     FROM answers 
     WHERE question_id = Q.question_id 
    ) 
    AND S.user_id = '$userID' 
0

您将需要运行2个独立的查询的我想是因为加入是为2台具有独特属性..所以你无法在加入1个问题一大堆答案的匹配。

$query = mysql_query("select * from `answers` where `user_id` = '$bar'"); 

while ($rslt = mysql_fetch_assoc($query);) { 
    $in_clause .= $rslt['question_id'].','; 
} 
$in_clause = substr($in_clause,0,-1); 
$next_query = mysql_query("select * from `questions` where `question_id` !in(".$in_clause.")"); 
2

你的问题太不清楚,它缺乏信息。您需要包含表格的模式,样例记录和所需的输出以使其更清晰。我想你要选择一个尚未回答的问题:我想运行选择最新的问题,用户没有回答查询...声明只会是这样的:

SELECT * FROM Questions WHERE CHAR_LENGTH(user_id) = 0; 

CHAR_LENGTH获取列中字符串的长度。当字段为空时,它返回ZERO

+0

你能解释使用CHAR_LENGTH的原因吗?我假设'user_id'的类型是'INTEGER',而不是'VARCHAR',所以调用'CHAR_LENGTH'会将'user_id'转换为一个字符串,然后计算它的长度,即'SELECT CHAR_LENGTH(10)'outputs'2 '。假设表'问题'有一个'user_id'列,如果问题没有得到解答,那么这个列是空的,为什么要用一个空的'VARCHAR'而不是'NULL'来表示呢? – Basti 2012-04-10 02:39:32

1

左连接可能是在这种情况下更合适:

SELECT Q.question_id, Q.question, S.user_id, S.question_id 
FROM questions Q 
LEFT JOIN answers S on Q.question_id=S.question_id AND S.user_id = '$userID' 
WHERE s.user_id IS NULL 

这应当会返回台1有没有符合条件的记录表中​​的所有条目S.

+1

''$ userID''永远不能是'NULL'。 – 2012-04-10 02:00:59

+0

@johntotetwoo这是一个'LEFT JOIN'。如果没有找到连接伙伴,'s.user_id'将会是'NULL'。但是这个条件没有意义,因为'user_id'不能同时是'$ userId' **和**'NULL'。所以这个条件等同于WHERE FALSE。 – Basti 2012-04-10 02:10:02

+0

看看这个:'WHERE S.user_id ='$ userID'' ** AND **'s.user_id IS NULL'。你可以用两个值来调整场地吗?我认为这是不可能的。 – 2012-04-10 02:13:08