簡體   English   中英

使用mysql / php從多個表的多個聯接返回多個結果

[英]Returning multiple results from multiple joins across several tables using mysql/php

好的,我想嘗試涉及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個變量。 弄清楚應該將什么連接到什么以及在何處有意義,更不用說我知道上面有問題的實際代碼結構了。

行話

就像您所知道的行話一樣: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則這些查詢可能無法正常工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM