2014-02-13 226 views
0

我試圖從兩個不同的mysql表中選擇一切。我將一個名爲「朋友」的數組打碎,這樣我就可以從兩個表中選擇有關用戶朋友的所有內容。最初我想在一個表上執行一個查詢,然後在一個while循環中查詢另一個表。但那並不奏效。如果你知道我的方式,我可以嵌套循環,然後請務必評論/回答這個問題。MySQL在同一個查詢中從兩個表中選擇

這裏是我的代碼:

$friends = implode("','", $friends); 
//implode the friends array for sql query 

$sql = mysqli_query($con, "SELECT * FROM users, text_post WHERE username IN ('$friends')") or die(mysqli_error($con)); 
while ($row = mysqli_fetch_assoc($sql)) { 
    echo $row['last_name']. ' ' . $row['body']; 
    echo '<br><br>'; 
} 

注:$row['last_name']是從用戶表和$row['body']從TEXT_POST表。每當我運行我的代碼時,我收到此錯誤Column 'username' in where clause is ambiguous

請幫助我。

UPDATE:

我改變了我的查詢:$sql = mysqli_query($con, "SELECT * FROM users, text_post WHERE users.username IN ('$friends')") or die(mysqli_error($con));,但現在它的回聲是每場比賽兩次:


帕克你好

帕克你好

西姆斯是什麼了

simms what is up

西姆斯下雨

西姆斯下雨

豪爾赫土豆

豪爾赫土豆


爲什麼這樣做?

兩個表中唯一相同的是用戶名。

回答

0

感謝您的問題。這裏的問題是,您收到的錯誤:

Column 'username' in where clause is ambiguous. 

這意味着的是,正在運行的說法太模糊。

你需要做的事情是避免這種情況是明確定義你試圖訪問的表和列,從而隱含在你的語句中。

隨着拇指的嘗試,始終按以下格式定義列的規則:

{table_name}.{column_name} 

有了這樣說下面應該工作:

$friends = implode("','", $friends); 
/* implode the friends array for sql query. */ 

$sql = mysqli_query($con, "SELECT * FROM users, text_post WHERE users.username IN ('$friends') AND text_post.username IN ('$friends')") or die(mysqli_error($con)); 
while ($row = mysqli_fetch_assoc($sql)) { 
    echo $row['last_name']. ' ' . $row['body']; 
} 

此外,我還建議你使用PHP的PDO對象作爲mysqli_query方法的一部分。

我相信這會有所幫助。

+0

你的回答是最好的解釋。謝謝你 – nitrous

0

這兩個表都有一個用戶名。使用table.username指定它

+0

它的工作,但現在它每次循環播放兩次'$ row ['body']'和'$ row ['last_name']'兩次。 我更新了更詳細的問題 – nitrous

0

顯然這兩個表具有相同的列,並且您沒有在表名的前面加上用戶名列。 也許你想要的是一個工會?

0

使用表前綴userswhere塊即users.username

$sql = mysqli_query($con, "SELECT * FROM users, text_post WHERE users.username IN ('$friends')") or die(mysqli_error($con)); 
+0

擺脫了錯誤,但它顯示了每場比賽兩次。 – nitrous

+0

實際上應該有'join/inner join',但是表格並不是以這種方式設計的,我想! 'text_post'表不應該有'用戶名'列,而應該有'用戶'表的'user_id'列作爲外鍵,然後一個簡單的'join'將刪除重複的匹配!我希望,我很清楚 – sarwar026

0

試試這個:

$friends = implode("','", $friends); 
    //implode the friends array for sql query 

    $sql = mysqli_query($con, "SELECT users.last_name,text_post.body FROM users, text_post WHERE username IN ('$friends')") or die(mysqli_error($con)); 
    while ($row = mysqli_fetch_assoc($sql)) { 
     echo $row['last_name']. ' ' . $row['body']; 
    } 
0

你的邏輯將是工作如果沒有用戶名存在這兩個表所示。因爲它是,你需要別名你的表名,這樣你就可以唯一地識別你試圖在where子句中使用哪個列:

SELECT * from users AS u,text_post as tp WHERE u.username IN (....)

或更短: SELECT * from users u,text_post tp WHERE u。使用者名稱(....)

作爲一個側面說明,這是不好的做法,SELECT *,你應該始終明確地選擇你想要的列,否則,如果您添加列到表的代碼可能會崩潰後,忘記更新您的for循環以包含/忽略任何更改的列。

+0

它每回合出兩次迴應。你知道爲什麼嗎? – nitrous

+0

不知道表的結構如何,我猜這是因爲條目顯示兩次?也許你應該加入表ON用戶名,而不是從兩個選擇*? – KaibutsuX

+0

你能否詳細說明你的意思? – nitrous

相關問題