2014-02-13 161 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

相关问题