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和(最后 2 个非常具有误导性)。您拥有的表越多,您就越需要关注列的命名方式。最好坚持一个共同的模式,或者在我看来是最合适的。followers.id_usercomments.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'];

正如您现在看到的,查询非常简单,并且只有一个谓词。我在SQL Fiddle上创建了一个没有数据的测试平台。

在我看来,您的结构非常好。无需更改表设计或此查询。

于 2012-05-18T07:15:18.907 回答
1

它实际上是一个非常简单的查询,只是很多表。

我不会尝试在一个大查询中检索所有内容,这会导致输出中出现大量重复数据,我会执行一个查询来检索用户/董事会/图片信息,另一个查询关注者,另一个查询来获取评论。

此外,您可以使用 ANSI 语法以获得更好的可读性。

于 2012-05-17T19:39:27.617 回答