4

ユーザーのすべての質問を取得するクエリを作成する必要があり、質問ごとにデータベースから 3 つの回答を取得する必要があります。このクエリは、可能な限り効率的である必要があります。

私はテーブルを持っています:

questions:
  id
  user_id
  title
  date_created
  date_updated

answers:
  id
  question_id
  user_id
  body
  date_created

1 つのクエリで実行できますか? 基本的に、質問を表示する必要があります。ユーザー テーブルと結合してユーザー名を取得し、質問に対する 3 つの回答を表示し、回答ごとに投稿者のユーザー名を表示する必要があります。

私が指摘したのは次のようなものです:

SELECT questions.*, GROUP_CONCAT(answers.id) as answers 
  FROM (questions) 
  JOIN users ON users.id = questions.user_id 
  LEFT JOIN answers ON answers.question_id = questions.id 
 WHERE questions.user_id = '1' 
 GROUP BY questions.id 
 ORDER BY questions.date_updated desc 
 LIMIT 3

しかし、これはまだ終わっておらず、うまく機能していません。

4

3 に答える 3

1

クロス適用を使用することをお勧めします...使用しているSQLサーバーのバージョンによって異なりますが、サンプルクエリを次に示します。
質問に回答があるかどうかわからない場合は、外部適用を使用します。回答のある質問
のみが必要な場合は、クロス適用を使用します。

SELECT
  q.id,
   q.[user_id],
   q.title,
   q.date_created,
   q.date_updated,
   ans.id,
   ....
FROM
  questions q
     CROSS APPLY
     (
     SELECT TOP 3
        a.id,
       a.question_id,
       a.[user_id],
       a.body,
       a.date_created
     FROM
       answers a
     WHERE
       q.id = a.question_id
     ) ans

ここでもっと見る

于 2012-11-23T03:23:01.653 に答える
0

データベースの設計を次のように変更してみてください。

post:
  id
  parent_id
  user_id
  title
  date_created
  date_updated

この設計では、質問には NULL の parent_id があります。これで、次のようなクエリを作成できます。

select posts.* from
(
    SELECT id, parent_id, user_id, title, date_created, date_updated FROM post WHERE id = 67
    UNION ALL
    SELECT id, parent_id, NULL as user_id, NULL as title, NULL as date_created, NULL as date_updated FROM post WHERE parent_id = 67
) posts
Left JOIN users ON users.id = posts.user_id
WHERE posts.user_id = '1' 
ORDER BY posts.date_updated desc 
LIMIT 3

データベースからデータを取得するときは、NULLのparent_idが最初にあることを確認して、質問が最初の位置にあるようにします。このようにして、はるかに高速で管理しやすく、読みやすくなります。

于 2012-07-11T00:58:13.937 に答える
0

タイトルが質問で本文が回答であると仮定すると、奇妙な理由で、質問テーブルの id フィールドが回答テーブルの質問 id に関連しています。3 つの回答を制限するには、サブクエリを作成することをお勧めします。

SELECT title, FROM questions 
WHERE user_id IN 
(SELECT users.username, answers.body FROM users, answers WHERE 
 answers.user_id = users.user_id LIMIT 3); 

ただし、質問テーブルで question_id が id と呼ばれているという事実を修正します。外部キーに、関連する主キーと同じ名前を付けないのは非常に悪い習慣です。

于 2012-07-10T21:19:24.170 に答える