2016-08-14 6 views
1

私のような質疑応答のウェブサイトがあります。私はこのようなテーブルを持っている:投稿とそれに関連するすべての投稿を選択するにはどうすればよいですか?

// qanda 
+----+----------+----------------------+---------+------+ 
| id | title |  content  | related | type | 
+----+----------+----------------------+---------+------+ 
| 1 | a title | a content   | NULL | 0 | 
| 2 |   | a content   | 1  | 1 | 
| 3 | a title | a content   | NULL | 0 | 
| 4 |   | a content   | 1  | 1 | 
| 5 |   | a content   | 3  | 1 | 
+----+----------+----------------------+---------+------+ 
/* type column:  "0" means it is a question, "1" means it is a answer 
    related column: it contains the id number of its own question 
*/ 

は、今私はid数に基づいて、質問とそのすべての自身の答えを選択する必要があります。 idの数字は質問のIDまたは回答IDのどちらでもかまいません)

SELECT * FROM qanda WHERE id = :id OR related = :id 

私のクエリは、同様:idは質問のIDである場合にのみ機能:

は、ここに私の現在のクエリです。 (回答のIDが:idの場合は正しく動作しません)ここで


期待された結果である:私は上記のように

assuming either :id = 1 or :id = 2 or :id = 4 
+----+----------+----------------------+---------+------+ 
| id | title |  content  | related | type | 
+----+----------+----------------------+---------+------+ 
| 1 | a title | a content   | NULL | 0 | 
| 2 |   | a content   | 1  | 1 | 
| 4 |   | a content   | 1  | 1 | 
+----+----------+----------------------+---------+------+ 

、私は:id = 1または:id = 2または:id = 4場合はこれらの3つの行を選択する必要があります。どうやってやるの?

+0

スキーマを[質問と回答]表に分割し、親質問への回答ごとに外部キー制約を設定する方が理にかなっています。この現在のデザインは災害のためのレシピです – Alex

+0

@Alexデータベースデザインを変更します*(質問と回答の2つの分離されたテーブルを作成する)*あなたが私のウェブサイトの次のバージョンで言ったように..現在私は問題を解決する必要があります。 mに直面した。 –

+0

新しいデータベースデザインに移行することができれば、現在どのくらいのデータを保存していますか?これをお勧めします。 – Alex

答えて

1

次のクエリが機能するはずです。クエリは、一緒に結合された4つの部分に分割されています。各クエリの説明:

  1. 戻り値は:idが質問
  2. 返し答えであれば:idが問題であれば:idが答え
  3. ある場合
  4. 戻り値は:idが答えであれば
  5. 返し答えを問う質問

クエリ:

select q.* 
    from quanda q 
where q.id = :id 
    and q.type = 0 
UNION ALL 
select a.* 
    from quanda a 
where a.related = :id 
UNION ALL 
select q.* 
    from quanda a 
    join quanda q 
    on q.id = a.related 
where a.id = :id 
    and a.type = 1 
UNION ALL 
select a2.* 
    from quanda a1 
    join quanda a2 
    on a2.related = a1.related 
where a1.id = :id 
    and a1.type = 1 
+0

ただ1つの質問、なぜ私の質問が2つのdownvotesを得たのですか?どうしたの? –

+2

推測された推測:私はいくつかdownvotedと思われます。なぜなら、彼らは基本的にあなたのdbデザインに同意しないからです。個人的に、私はそれがdownvoteの正当な理由だとは思わない。ダウンフォースは、努力の欠如を示す質問が有用であるか不明であるかにかかわらず、ダウンフォートイメージ上にマウスを置いたときに表示されるべきです。誰もがあなたがしようとしていることに誰もが同意することはできませんが、私はあなたが自分自身を明確に説明したと思います。特に、SOに関する質問の90%と比較してください。 – sstan

+2

私はあなたのデータベース設計に同意していませんが、私はあなたの投稿を実際にupvoteしたのは明らかです。それは低品質ではないので、私は投票に値するとは思わない! – Alex

関連する問題