php - 使用 mysql/php 从多个表中的多个连接返回多个结果

标签 php mysql

好吧,我正在努力尝试进行涉及 3 个表的多重连接。在将 URL 中的故事 ID (SID) 传递到此页面后,只是试图返回故事的标题、作者和文本。基本上我试图返回故事标题、故事作者和文本。到目前为止,只有故事标题在此代码中起作用。

脚本正在传递故事 ID (SID),我正尝试使用它来获取故事的作者姓名和文本以及有效的故事标题。

这是 3 个表:

user_meta table which has ID, display_name
stories table which has ID, SID, story_name
writing table which has SID, text

这是到目前为止的代码(同样,在 URL 中传递 SID 之后只有标题有效)

<?php
global $wpdb;
// get the SID
$the_SID = ( isset( $_GET['writing'] ) ) ? $_GET['writing'] : false;


$results = $wpdb->get_results("
SELECT wp_users.ID, wp_users.display_name,
stories.SID, stories.story_name,
writing.text
FROM stories
LEFT JOIN writing ON stories.SID = writing.SID
LEFT JOIN wp_users ON stories.ID = wp_users.ID
WHERE stories.SID = $the_SID");
?>

Title: <b><?php echo $results[0]->story_name ?></b>
<p>
by: <em><?php echo $results->display_name ?></em><br />
<p>
<?php echo $results->text ?>    

我知道会有 sql 注入(inject)问题,但现在我只是想学习如何通过跨 3 个表的多个连接返回这 3 个变量。弄清楚什么应该加入什么以及在哪里加入是很棘手的,更不用说我知道上面有问题的实际代码结构了。

最佳答案

行话

只是为了让您了解行话:DDL 是数据定义语言 — 您的表的定义。 http://sqlfiddle.com/是一个非常酷的网站,您可以在其中处理 SQL 查询,然后将链接发布到诸如 StackOverflow 问题之类的内容中。

问题的答案

如果我正确理解你的问题,给定一个特定的 SID 值(假定故事 ID),你需要故事的作者、标题和文本。

您确实应该使用单个查询来获取该信息。我认为这个查询会给你想要的:

SELECT u.ID. u.display_name,
       s.SID, s.story_name,
       w.text
  FROM stories AS s
  JOIN user_meta AS u ON s.ID = u.id
  JOIN writing AS w ON s.SID = w.SID
 WHERE s.SID = $the_SID

(注意:我已经格式化了这些东西,所以很容易看到 SQL 逻辑。您可以在代码中的任何地方放置换行符。)

解释

这里的技巧是使用JOIN 操作来组合来自不同表的信息。 ON 子句控制要连接的表中的哪些行与第一个表中的每一行相关联。

此查询从 stories 表开始:

  FROM stories AS s

然后它通过匹配这两个表中的 ID 列连接到 user_meta 表。这是基于 ID 列标识用户的猜测。

  JOIN user_meta AS u ON s.ID = u.id

最后,它使用 SID 列连接到 writing 表:

  JOIN writing AS w ON s.SID = w.SID

评论

您的示例中有一些奇怪的查询,看起来像下一行。这些是自连接,您可以在其中将表连接到自身。在尝试这样做之前,您可能应该掌握不同表之间的 JOIN 操作。

FROM writing LEFT JOIN writing ON stories.SID=writing.SID  /*probably wrong*/

您可能想要这种东西,因为它更有意义。

FROM stories LEFT JOIN writing ON stories.SID=writing.SID

为了回答您评论中的问题,大多数使用 SQL 编写软件应用程序的人都会尽量减少查询数量。他们尽量避免编写 PHP 来使用一个查询的结果来驱动第二个查询。这个想法是,从您的 PHP 代码到 MySQL 服务器的往返行程是最小化的。这不是硬性规定,但确实有助于提高性能。

您在问题中提到了部分 WordPress API。您需要知道名称以 _meta 结尾的 WordPress 表比您提到的 user_meta 表具有更精细的结构。如果您实际使用 WordPress 的 user_meta,这些查询可能无法正常工作。

关于php - 使用 mysql/php 从多个表中的多个连接返回多个结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24986493/

相关文章:

javascript - 将变量从 php 发送到 jquery - 文件上传脚本

mysql - 限制返回的行数 ORDER BY

php - 无需刷新页面即可将下拉菜单中的数据提交到mysql

mysql - com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException : Unknown column 'poi' in 'where clause'

c# - 单个或多个 MySqlDataReader

php - 我应该在 PHP 中始终使用完全限定的类名吗?

php - Doctrine_RawSql 自定义选择

php - Symfony2 用户管理,使用 FOSUserBundle 还是使用 Symfony cookbook 代码作为起点滚动我自己的?

PHP MySQL LIKE 命令无法正常工作

php - 在端口 8080 上运行的 Apache 会阻止 JavaScript 中的动态加载脚本吗?