2

亲爱的朋友们!我要感谢大家对我这样的菜鸟的帮助和理解。这是我的第二个问题,所以请原谅。

我想加入 2 个表(AUTHORS 和 BOOKS),以便表 2 中的 AUTHOR_REF 将是表 1 中作者的完整名称(而不是 AUTHOR_REF)。(authors.id 和 books.author_ref 之间存在外键约束关系

这 2 个表是:

    **ID     LAST NAME     FIRST NAME**
      1      Palahniuk     Chuck
      2      Faulkner      William 
      3      Beckett       Samuel

    **ID     TITLE               AUTHOR_REF**
      1      Fight Club              1
      2      Absalom, Absalom!!      2
      3      Choke                   1
      4      Waiting for Godot       3

案例/问题: 用户在网站上搜索某本书。我使用准备好的语句来准备查询:

    $stmt = mysqli_prepare($db, "SELECT title, autor_ref FROM books WHERE title LIKE CONCAT('%', ?, '%')" );

我知道我应该使用一些带有 WHERE 条件的 JOIN,类似于:'authors.last_name=books.author_ref',但我已经从第一个 SELECT 中获得了 WHERE 条件。我怎样才能实现我的目标?

我真的很困惑。我的数据库设计不好?

任何帮助将不胜感激。问候

4

3 回答 3

2

不,您实际上是在正确的轨道上,并且您的数据库设计正确。JOIN遗嘱有自己的条件ON,不属于该WHERE条款:

SELECT
  title, 
  `FIRST NAME`,
  `LAST NAME`
FROM
  books
  /* Join brings over the author name */
  JOIN authors ON books.AUTHOR_REF = authors.ID
/* WHERE clause does not change */
WHERE title LIKE CONCAT('%', ?, '%')

如果您有任何没有已知作者 ( AUTHOR_REF IS NULL) 的书籍,请使用 aLEFT JOIN代替,这样书名仍会返回,并带有NULLs 作为作者姓名。

SELECT
  title, 
  `FIRST NAME`,
  `LAST NAME`
FROM
  books
  /* Left join ensures a row returned for the book even if it has no author */
  LEFT JOIN authors ON books.AUTHOR_REF = authors.ID
WHERE title LIKE CONCAT('%', ?, '%')
于 2013-01-05T13:01:22.730 回答
1

我会在这个数据库上构建一个有点不同的数据库......

AUTHORID     LAST NAME     FIRST NAME
  1          Palahniuk     Chuck
  2          Faulkner      William 
  3          Beckett       Samuel

BOOKID     TITLE               AUTHORID
  1        Fight Club              1
  2        Absalom, Absalom!!      2
  3        Choke                   1
  4        Waiting for Godot       3

然后通过使用加入他们:

SELECT title, `FIRST NAME`,`LAST NAME`
FROM books
LEFT JOIN author USING (AUTHORID) 
WHERE title LIKE CONCAT('%', ?, '%')
于 2013-01-05T13:09:33.743 回答
0
 $stmt = mysqli_prepare($db, "SELECT a.*, b.autor_ref FROM authors as a, books as b WHERE b.author_ref = a.id AND b.title LIKE '%$search%'" );

获取此内容后,您可以显示完整的作者姓名等等(例如该作者的更多电影)。

于 2013-01-05T13:12:46.077 回答