首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用mysql/php跨几个表返回多个联接的多个结果

使用mysql/php跨几个表返回多个联接的多个结果
EN

Stack Overflow用户
提问于 2014-07-27 22:59:22
回答 1查看 78关注 0票数 1

好的,我正试图做多个连接,涉及3个表。在将故事id (SID)传递到此页面的URL中后,尝试返回故事的标题、作者和文本。基本上,我试图返回故事标题,故事作者和文本。到目前为止,只有故事标题在这段代码中有效。

脚本正在传递故事ID (SID),我正在尝试使用它来获得故事的作者名称和文本,以及确实起作用的故事标题。

以下是三张表:

代码语言:javascript
复制
user_meta table which has ID, display_name
stories table which has ID, SID, story_name
writing table which has SID, text

以下是目前为止的代码(同样,只有标题在获得SID传入URL后才能工作)

代码语言:javascript
复制
<?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个变量。很难理解什么应该加入什么,哪里应该加入什么,更不用说我的实际代码结构,我知道它上面是错误的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-07-28 00:58:47

行话

让您知道术语: DDL是数据定义语言--表的定义。http://sqlfiddle.com/是一个非常酷的网站,您可以在其中使用SQL查询,然后在类似于StackOverflow问题的内容中发布链接。

回答问题

如果我正确地理解了您的问题,给出了一个特定的SID值(Story假设),那么您就需要故事的作者、标题和文本。

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

代码语言:javascript
复制
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表开始:

代码语言:javascript
复制
  FROM stories AS s

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

代码语言:javascript
复制
  JOIN user_meta AS u ON s.ID = u.id

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

代码语言:javascript
复制
  JOIN writing AS w ON s.SID = w.SID

评论

在您的示例中有一些奇怪的查询,如下所示。这些是自联接,在其中,您将一个表连接到自己。在尝试这样做之前,您可能应该掌握不同表之间的联接操作。

代码语言:javascript
复制
FROM writing LEFT JOIN writing ON stories.SID=writing.SID  /*probably wrong*/

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

代码语言:javascript
复制
FROM stories LEFT JOIN writing ON stories.SID=writing.SID

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24986493

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档