php - 连接 2 个表的查询(使用 LIKE 和准备好的语句)

标签 php mysql

亲爱的 friend 们大家好!我要感谢大家对像我这样的菜鸟如此热心的帮助和理解。这是我的第二个问题,请怜悯。

我想连接 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('%', ?, '%')" );

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

我真的很困惑。我的数据库设计得很糟糕吗?

如有任何帮助,我们将不胜感激。 问候

最佳答案

不,您实际上走在正确的轨道上,并且您的数据库设计正确。 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),请使用 LEFT JOIN 代替,以便书名仍返回,作者姓名为 NULL

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('%', ?, '%')

关于php - 连接 2 个表的查询(使用 LIKE 和准备好的语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14171930/

相关文章:

MySQL存储过程从秒查询返回变量值?

javascript - 我添加了这段代码,但现在子 <li> 菜单列表未打开..执行了操作但未打开菜单

php - Redis 上的 "Connection Refused"错误

php - 如何将自定义数据传递给模板

mysql - 帮助在不使用实际数据的情况下向表中添加记录

mysql - 运行 CREATE TABLE 脚本时出现错误 1064

php - 如何在 CakePHP 中使用本周、本月、今年搜索数据

php - 在哪里存储 Android 应用程序(如 Whatsapp)的个人资料图像?

mysql - 联合所有和选择

php - Laravel:通过 xp_start 和 xp_end 查找行