好吧,我正在努力尝试进行涉及 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/