0

pinterest(勉強用)のようなサイトをデザインしていますが、ユーザーのストリームを表示するためにホームページでどのようなクエリを実行する必要があるのか​​知りたいです。

これらの6つのテーブルを作成しました。

users
boards
pictures
boards_pictures ( many-to-many table )
followers
comments

そして家では、このクエリを実行してすべてのフォロワーの写真を取得します。

SELECT users.username, pictures.link, comments.comment, boards.title
FROM boards_pictures, pictures, followers, users, comments, boards 
WHERE ( boards_pictures.id_user = followers.id_following ) 
  AND ( boards_pictures.id_picture = pictures.id ) 
  AND ( followers.id_user = $_session['userid'] ) 
  AND ( users.id = followers.id_following )
  AND ( comments.picture_id = pictures.id )
  AND ( boards.id = boards_pictures.boards_id )

この複雑なクエリ(6つのテーブルを持つJOIN)を回避する方法はありますか?

4

2 に答える 2

1

クエリから推測されるDDLステートメントは次のとおりです。

CREATE TABLE users (id integer, username varchar(30));
CREATE TABLE boards (id integer, title varchar(30));
CREATE TABLE pictures (id integer, link varchar(90));
CREATE TABLE boards_pictures (
  id_user integer,
  id_picture integer,
  boards_id integer);
CREATE TABLE followers (id_user integer, id_following integer);
CREATE TABLE comments (picture_id integer, comment varchar(350));

ここでは、列の命名スタイルを混合しています。、、、およびを比較してくださいusers.id(最後followers.id_userの2つはかなり誤解を招く可能性があります)。テーブルが多いほど、列の名前に注意を払う必要があります。単一の一般的なパターンに固執するか、私の見解では最も適切である方が良いです。comments.picture_idboard_pictures.id_picturepicture_iduser_id

暗黙の結合表記を使用している場合を除いて、クエリは複雑ではありません。一部の述語を見逃して、2つ(またはそれ以上)のテーブルのデカルト積になる可能性があるため、これは推奨される方法ではありません。

クエリは次のように書き直すことができます。

SELECT u.username, p.link, c.comment, b.title
  FROM boards_pictures bp
  JOIN pictures p ON p.id = bp.id_picture
  JOIN followers f ON bp.id_user = f.id_following
  JOIN users u ON u.id = f.id_following
  JOIN comments c ON c.picture_id = p.id
  JOIN boards b ON b.id = bp.boards_id
WHERE f.id_user = $_session['userid'];

ご覧のとおり、クエリは非常に単純で、述語は1つだけです。SQLFiddleのデータなしでテストベッドを作成しました。

私の見解では、あなたの構造はかなり良いです。テーブルのデザインもこのクエリも変更する必要はありません。

于 2012-05-18T07:15:18.907 に答える
1

これは実際には非常に単純なクエリであり、多くのテーブルがあります。

1つの大きなクエリですべてを取得しようとするのではなく、出力で多くの重複データが発生します。ユーザー/ボード/画像情報を取得するためのクエリ、フォロワーのための別のクエリ、コメントのための別のクエリを実行します。

また、読みやすさを向上させるためにANSI構文を使用できます。

于 2012-05-17T19:39:27.617 に答える