Mysql查询Ask-Answer-Comment数据库

时间:2012-02-18 06:55:57

标签: php mysql sql

在诸如stachexchange项目之类的Question / Answer / Comment的数据库结构中,数据库模式可以是与FK s连接的三列。这似乎是理想的,但我想知道检索问题数据的最有效查询是什么。 Answers将被简单地检索并由question_id的WHERE子句列出。

我的问题是如何列出嵌套在相应答案下的评论?我正在处理PHP while循环以列出答案和注释的子列表。

我心目中的一个非常基本的结构。我的问题的目的是找到想法数据库结构;因此,这只是一个建议。

CREATE TABLE questions (
question_id int(11) NOT NULL AUTO_INCREMENT,
title varchar(255),
content text,
PRIMARY KEY (question_id);

CREATE TABLE answers (
answer_id int(11) NOT NULL AUTO_INCREMENT,
question_id int(11) REFERENCES questions(question_id),
content text,
PRIMARY KEY (answer_id);

CREATE TABLE comments (
coment_id int(11) NOT NULL AUTO_INCREMENT,
question_id int(11) REFERENCES questions(question_id),
answer_id int(11) REFERENCES answers(answer_id),
content text,
PRIMARY KEY (coment_id);

2 个答案:

答案 0 :(得分:2)

假设表结构如下(简化)

Questions Table
QID | Question

Answers Table
AID | fQID | Answer

Comments Table
CID | fAID | comment

fQID =外键问题表

fAID =答案表的外键

以下查询将选择特定问题的所有评论

select comment from question join answers on QUI=fQUID join comments on AID=fAID where QID='$questionID'

以下查询将选择符合答案ID的评论

select aid, answer, comment from question join answers on QUI=fQUID join comments on AID=fAID where AID='$answerID'

编辑:

对于在答案下嵌套注释,请使用类似的东西(你需要修改它,这非常粗糙)

$sql = 'select comment, cid, aid, answer from question join answers on QUI=fQUID left join comments on AID=fAID where QID='$questionID' order by AID';
$result = mysql_query($sql);

$row = mysql_fetch_array($result);
echo "<div>" . $row['answer'];
$current = $row['aid'];
do{
  if($current != $row['aid']){
    print "</div>\n<div>" . $row['answer'];
    $current = $row['id'];
  }

  $current = $row['aid'];
  if($row['cid'] != null){
    print "<div>" . $row['comment'] . "</div>";
  }
}while($row = mysql_fetch_array($result));

print "</div>";

答案 1 :(得分:1)

这是最简单的方法和最高效的

CREATE TABLE posts (
post_id int(11) NOT NULL AUTO_INCREMENT,
parent_id int(11) REFERENCES posts(post_id),
title varchar(255),
content text,
PRIMARY KEY (post_id);


CREATE TABLE comments (
coment_id int(11) NOT NULL AUTO_INCREMENT,
post_id int(11) REFERENCES posts(post_id),
content text,
PRIMARY KEY (coment_id);

问题帖子将有一个NULL parent_id。这将是最简单,最灵活的设计。

以下是加载页面的示例查询。

select * from posts where post_id = 9 or parent_id = 9
  

我的问题是如何列出嵌套在其对应的注释   回答?我正在处理PHP while循环列出答案和   评论的子列表。

简单,当您循环播放帖子时 - 根据当前帖子ID

过滤评论

现在,如果你想要这么简单,你可以将评论放在帖子表中

CREATE TABLE posts (
post_id int(11) NOT NULL AUTO_INCREMENT,
parent_id int(11) REFERENCES posts(post_id),
is_comment bit(1),
title varchar(255),
content text,
PRIMARY KEY (post_id);

注意: is_comment列

以下是查询页面的方法:

select * from posts where post_id = 9 or parent_id = 9 or parent_id IN (select post_id from posts where parent_id = 9)

抱歉,我不是一个mysql人