Php 更正mysql查询以查询一个表,并使其为另一个表查询提供信息

Php 更正mysql查询以查询一个表,并使其为另一个表查询提供信息,php,mysql,sql,Php,Mysql,Sql,我有两个单独的表,我需要同时查询这两个表以获得要显示的正确信息。表是成员和职位。通过html表单,用户为members表输入条件,然后我需要使用所有这些特定成员的主索引来查找这些成员提交的所有帖子,然后对帖子表结果进行排序。结果将是两个表中的行的混合。两个表都有一个名为“id”的主索引。到目前为止,我想到的是: $sql_get_posts = mysqli_query($link, "(SELECT id, username FROM members WHERE active='y' AND

我有两个单独的表,我需要同时查询这两个表以获得要显示的正确信息。表是成员和职位。通过html表单,用户为members表输入条件,然后我需要使用所有这些特定成员的主索引来查找这些成员提交的所有帖子,然后对帖子表结果进行排序。结果将是两个表中的行的混合。两个表都有一个名为“id”的主索引。到目前为止,我想到的是:

$sql_get_posts = mysqli_query($link, "(SELECT id, username FROM members WHERE active='y' AND gender='M' AND city='Yuma' AND state='Arizona') UNION (SELECT * FROM posts WHERE member_id='id' AND active='y' ORDER BY list_weight DESC)") or die(mysqli_error($link));
我得到的错误是使用的SELECT语句的列数不同

然后,我需要遍历两个表返回的结果,以填充用户看到的内容:

<?php
   while ($row = mysqli_fetch_array($sql_get_posts)) {
     $post_id = $row['id']; //This should be the post primary index named 'id', not the member primary index also name 'id'
     $member_id = $row['member_id']; //This is the member_id row in the post table referencing this particular member who wrote this post 
     $member_username = $row['username']; //This is a row stored in the member table
     $title = $row['title']; //This is a row stored in post table
     ******//and on and on getting rows from only the post table
   }

UNION中的SELECT语句必须具有相同的列数。列还必须具有类似的数据类型。此外,每个SELECT语句中的列的顺序必须相同

但是您在第一个查询中只选择了2列,*对于第二个select查询,请使用联接

SELECT m.id, m.username,p.* FROM members m JOIN posts p on m.active='y' AND m.gender='M' AND m.city='Yuma' AND m.state='Arizona' and p.member_id='id' AND p.active='y' ORDER BY p.list_weight DESC
或者你可以使用

SELECT m.id, m.username,p.* FROM members m,posts p where m.active='y' AND m.gender='M' AND m.city='Yuma' AND m.state='Arizona' and p.member_id='id' AND p.active='y' ORDER BY p.list_weight DESC
使用union而不是union,union假设要合并的表是相似的,而join合并两个表的列

比如:

SELECT members.id, members.username, posts.*
FROM members
INNER JOIN posts
ON members.id = posts.member_id
WHERE members.active='y' AND members.gender='M' AND members.city='Yuma' AND members.state='Arizona'
ORDER BY posts.list_weight DESC

显示两个表的表结构。只有在bot select子句中的列数相同时,Union才起作用。@BrokenHeartღ 在phpmyadmin。我会设法弄明白的。问题是两个查询中的列数。在第一次查询中,只选择了两个字段,下一次查询将选择所有字段,这就是问题所在。条件在哪里?更新为添加where子句、order by和特定列名。@Solaris。这似乎奏效了。但是我很好奇,php/mysql怎么知道我在请求行中的post表主索引:$post_id=$row['id'];,而不是同名的members表主索引?我假设这是因为posts id覆盖了成员id,因为它是第二个添加的。为确保名称不重叠,您可以更改SELECT members.id,。。。选择members.id作为MemberID或类似的东西。我刚刚更改了$post_id=$row['id'];to$post_id=$row['posts.id'];它仍然有效!精神崩溃。我真的需要打开一本sql书来检查所有的可能性。我不是Mysql忍者。m来自哪里?m是表成员的对象,正如您在查询成员m和posts p中所看到的,因此我们可以简单地使用这些对象(如m.id、p.name等)来访问列,这在所有响应之后有点意识到了。人们说我应该用JOIN来代替。
SELECT members.id, members.username, posts.*
FROM members
INNER JOIN posts
ON members.id = posts.member_id
WHERE members.active='y' AND members.gender='M' AND members.city='Yuma' AND members.state='Arizona'
ORDER BY posts.list_weight DESC