2011-03-27 68 views
2

我有两个表格的问题和答案。从同一用户的两个表中获取数据?

- questions{id,user_id,question,date} 
- answers {id,q_id,user_id,answer, date} 

我想用同样的用户检索已输入的问题和答案

i.e. select all answer and all questions for ID=39 order by date DESC 

而且以后我有一个查询,我想同时通过获取数组,并显示数据,我如何区分它是一个问题还是答案,所以我可以正确显示它们。

编辑:

SELECT 'Q' AS 
TYPE , q.question AS value, q.date 
FROM questions q 
WHERE q.user_id =39 
UNION ALL SELECT 'A' AS 
TYPE , q.question AS value, a.date 
FROM answers a,questions q 
WHERE a.q_id = q.id 
AND 
WHERE a.user_id =39 
ORDER BY `date` DESC 

我很抱歉,但即时通讯试图让已回答而不是答案本身的问题。我更新了SQL和顶部的数据库设计,但我不断收到一个错误

+0

你可以做两个单独的查询来分离问题和答案。 – sikas 2011-03-27 16:29:23

+0

请发布一个新问题,提供查询和错误的详细信息。 – 2011-03-27 17:14:21

+0

我已经检查了我的个人资料:))抱歉! – pingpong 2011-03-27 17:15:24

回答

2

用途:

SELECT 'Q' AS type, 
     q.question AS value, 
     q.date 
    FROM QUESTION q 
    WHERE q.user_id = ? 
UNION ALL 
    SELECT 'A' AS type, 
     a.answer AS value, 
     a.date 
    FROM ANSWER a 
    WHERE a.user_id = ? 
ORDER BY `date` DESC 

UNIONUNION ALL用于合并查询返回一个结果集。 UNION删除重复;因此,UNION ALL不会删除重复内容,并且比UNION更快。但是在UNION的语句中,所有SELECT语句的SELECT子句中都需要有相同数量的列。他们的数据类型必须在每个位置匹配。

为了区分答案和问题值,示例定义了静态值“A”代表答案,“Q”代表问题。您的应用程序层代码可以根据需要对其进行处理以格式化数据。

+0

谢谢你的答案,但是当我使用php获取数据时,我怎么知道它的类型A或类型Q谢谢! – pingpong 2011-03-27 16:32:03

+0

@pingpong:通过检查PHP中结果集的行的值。 – 2011-03-27 16:33:52

+0

感谢所以基本上这个单词类型现在实际上是值,即'FetchArray ['type']':))+1从我,所以我检查'FetchArray ['type']'是否等于A或Q – pingpong 2011-03-27 16:35:29

2
SELECT 'Q' as `type`, 
     id, 
     user_id, 
     question as quesion_or_answer, 
     `date` 
FROM questions 
WHERE user_id = 39 
UNION ALL 
SELECT 'A' as `type`, 
     id, 
     user_id, 
     answer as quesion_or_answer, 
     `date` 
FROM answers 
WHERE user_id = 39 
ORDER BY `date` DESC 
+1

+1:打我16秒 – 2011-03-27 16:42:17

-1

由于在问题和答案之间似乎没有关系:使用单独的查询。

+1

不是我的倒退(我倾向于同意这个观点)。然而,这不符合他们应该按照日期合并订购的要求。 – 2011-03-27 16:35:17

0

我会偷懒,ALL使用UNION作为,仅仅连接两个表:

SELECT *, NULL as answer FROM questions WHERE ID=39 
UNION ALL 
SELECT *, NULL as question FROM answers WHERE ID=39 
ORDER BY date DESC 

为后来differantiation的窍门是有一个空场,或一些其它标识符。

相关问题