2012-11-11 28 views
0

我有下面的查询:如何一次显示一行,如果所有的数据都是一样

$questionquery = " 
SELECT DISTINCT q.QuestionContent, o.OptionType, q.NoofAnswers, GROUP_CONCAT(DISTINCT Answer ORDER BY Answer SEPARATOR '') AS Answer, r.ReplyType, 
q.QuestionMarks, q.SessionId 
FROM Answer an 
INNER JOIN Question q ON q.QuestionId = an.QuestionId and an.SessionId = q.SessionId 
JOIN Reply r ON q.ReplyId = r.ReplyId 
JOIN Option_Table o ON q.OptionId = o.OptionId 
WHERE ".implode(" AND ", array_fill(0, $numTerms, "q.QuestionContent LIKE ?"))." 
GROUP BY an.SessionId, an.QuestionId 
ORDER BY ".implode(", ", array_fill(0, $numTerms, "IF(q.QuestionContent LIKE ?, 1, 0) DESC"))." 
"; 

现在下面是每个数据库表的样子:

会话表:

SessionId SessionName 
1   AAA 
2   AAB 
3   AAC 

Question Table:

SessionId QuestionId QuestionContent    ReplyId OptionId 
1   1   Here is a single answer  2  1 
2   3   Here is a single answer  2  1 
3   3   Here is a single answer  2  1 

Answe R表:

AnswerId SessionId QuestionId Answer 
1   1   1   True 
2   2   3   True 
3   3   3   True 

回复表:

ReplyId ReplyType 
1  Single 
2  Multiple 

选项表:

OptionId OptionType 
1   True or False 

现在我收到的问题是,在数据库中,我有一个是完全的三个问题相同的答案,相同的标记,相同的选项类型等,都是一样的,这是很好的。但在查询中,我想要做的是,如果有多个行的列都匹配,那么只显示一次。因此,在目前它在下面的查询输出显示此:

Here is a single answer  True or False 1 True Multiple 5 
Here is a single answer  True or False 1 True Multiple 5 
Here is a single answer  True or False 1 True Multiple 5 

但随着问题的所有细节是一样的,它应该只显示一次象下面这样:

Here is a single answer  True or False 1 True Multiple 5 

如何如果存在具有完全相同数据的多行,我可以使查询显示一行吗?

UPDATE:

$questionquery = " 
SELECT DISTINCT q.QuestionContent, o.OptionType, q.NoofAnswers, Answer, r.ReplyType, 
q.QuestionMarks 
FROM 
(
SELECT DISTINCT q.QuestionContent, o.OptionType, q.NoofAnswers, GROUP_CONCAT(DISTINCT Answer ORDER BY Answer SEPARATOR '') AS Answer, r.ReplyType, 
q.QuestionMarks, q.SessionId 
FROM Answer an 
INNER JOIN Question q ON q.QuestionId = an.QuestionId and an.SessionId = q.SessionId 
JOIN Reply r ON q.ReplyId = r.ReplyId 
JOIN Option_Table o ON q.OptionId = o.OptionId 
WHERE ".implode(" AND ", array_fill(0, $numTerms, "q.QuestionContent LIKE ?"))." 
GROUP BY an.SessionId, an.QuestionId 
) 
AS tmpresult 
ORDER BY ".implode(", ", array_fill(0, $numTerms, "IF(q.QuestionContent LIKE ?, 1, 0) DESC"))." 
"; 
+0

您可以添加限制1 – Joddy

+0

@Joddy在哪里添加查询中的限制1? – CMB

+0

后_ORDER BY DESC_ ** **新增 _LIMIT 1_ – Joddy

回答

0

强大是疯狂的想法,但仍值得尝试,从你的主要查询中做一个子查询并用DISTINCT做另一个选择:

SELECT DISTINCT {yourcolumns} 
FROM 
(
     your current code 
) as tmp 
+0

我将在5分钟内在我的问题中包含更新,更新是如何你想让我编码。 – CMB

+0

你能否删除GROUP_CONCAT(DISTINCT回答ORDER BY Answer SEPARATOR'')作为答案,因为它已经在子查询中计算过 – Farfarak

+0

嗨,试过这个但没有运气,它给了我这个错误'你的SQL中有错误句法;请检查与您的MySQL服务器版本相对应的手册,以便在'SELECT DISTINCT q.QuestionContent,o.OptionType,q.NoofAnswers,GROUP_CONCAT(DIS'at line 5''')附近使用正确的语法。代码已更新,以便您可以查看它现在看起来像 – CMB

0

展开您的GROUP BY条款添加这些列由要考虑的行作为重复类似下面

GROUP BY an.SessionId, an.QuestionId, QuestionContent, 
     OptionType, q.NoofAnswers, Answer, q.QuestionMarks 
+0

嗨,我已经尝试过,但它仍然显示重复行 – CMB

相关问题