好的,我正试着做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注入问题,但是现在我只是想学习如何在3个表中使用多个连接返回这3个变量。它很棘手,无法理解什么应该加入什么和哪里,更不用说我知道的实际代码结构是错误的。
答案 0 :(得分:0)
您知道行话: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
子句控制正在JOINed的表中的哪些行与第一个表中的每一行相关联。
此查询以stories
表格开头:
FROM stories AS s
然后通过匹配这两个表中的user_meta
列来加入ID
表。这是基于ID
列标识用户的猜测。
JOIN user_meta AS u ON s.ID = u.id
最后,它使用writing
列加入SID
表:
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
。