如何UNION ALL两个SELECT语句?

时间:2010-05-05 01:35:09

标签: php mysql

我有2张桌子,其中一张是这样的:

表一

id | Last Name | First Name | Username | Password | Secret Question

和另一个看起来像这样:

表二

id | Hobby | Country | 

我想组合一个Select语句,它从两个表中获取数据并输出结果。以下代码:

$select = mysql_query("

    SELECT * FROM table_one WHERE Username = 'Bob'

    UNION ALL

    SELECT * FROM table_two WHERE Hobby = 'Baseball'

");

while ($return = mysql_fetch_assoc($select)) {

$userName = $return['Username'];

$hobby = $return['Hobby'];

}

echo "$userName likes $hobby";

导致使用的SELECT语句有不同的列数错误,我做错了什么?


编辑:

运行此命令会出现以下错误:警告:mysql_fetch_assoc():提供的参数不是第16行/home/studentw/public_html/foo.php中的有效MySQL结果资源

$select = mysql_query("

SELECT FROM TABLE_ONE t1
  INNER JOIN TABLE_TWO t2
    ON t1.id = t2.id
WHERE t1.Username = 'Bob'
  AND t2.Hobby = 'Baseball'

");

while ($return = mysql_fetch_assoc($select)) {

    $firstName = $return['Username'];
    $hobby = $return['Hobby'];

}

echo "$firstName likes $hobby";

表中的值为:

表一

id | Last Name | First Name | Username | Password | Secret Question

 1 | Hughes | Bobby | Bob | 123 | Maiden name?

表二

id | Hobby | Country | 

 1 | Baseball | USA

2 个答案:

答案 0 :(得分:3)

我想你想要一个JOIN,而不是UNION或UNION ALL。

SELECT FROM TABLE_ONE t1
  INNER JOIN TABLE_TWO t2
    ON t1.id = t2.id
WHERE t1.Username = 'Bob'
  AND t2.Hobby = 'Baseball'

Unions要求每个表的数据列具有相同的数字和类型,并且基本上为您提供来自不同表的多行的串联。另一方面,连接基本上将一个表扩展为更宽的一个表,通过将另一个表的列连接到其上而具有更多列。

进行连接时,需要指定一个表的行与另一个表的对应方式;在这种情况下,我假设您的Id字段应该是将表连接在一起的主/外键。如果不正确,请道歉 - 如果是这样,我需要更多信息以便为您提供帮助。


根据您编辑过的问题:

我首先会将您链接到documentation for the mysql_query function。它有一个必需和一个可选参数;第二个参数是你的连接句柄。如果您未指定它,则PHP假定使用mysql_connect打开的最后一个连接是您要使用的连接。所以我的第一个问题是,您是否正确地致电mysql_connect并成功完成了该呼叫?

如果您确定mysql_connect来电有效,那么我不确定问题是什么。但是,我不认为将mysql_connect的结果分配给变量会让您在mysql_query中明确指定连接。可能类似于以下内容:

$conn = mysql_connect("localhost:3306", "username", "password");
$query = "select * from some_table"; // obviously use your own query here
$result = mysql_query($query, $conn);

如果这不起作用,请告诉我。

答案 1 :(得分:-1)

是的,Platinum Azure是正确的,您需要的是一个连接。但是,您的桌面设计需要一些帮助。

您需要将表相互关联。简单的方法是:

1)在表1中添加一列:“hobby_id” 2)然后表1中的每条记录记录需要在字段“hobby_id”中具有表2中的id

表1:

id | Last Name | First Name | Username | Password | Secret Question | hobby_id
1 | Hughes | Bobby | Bob | 123 | Maiden name? | 2
2 | Smith | Mike | Msmith | mypass | usual | 1

表2:

id | Hobby | Country | 
1 | Baseball | USA
2 | Hockey | Canada
3 | Horse Racing | Japan

请参阅表2中的hobby_id与id的关系?所以,表1,Bobby,扮演曲棍球和迈克打棒球。没有人匹配赛马。

因此,要查询这些表,它将如下所示:

select table1.`last name`,table1.`first name`, table2.`hobby`  from table1
inner join table2 on table1.hobby_id = table2.id

结果将是:

Hughes | Bobby | Hockey
Smith | Mike | Baseball

然后您的PHP代码如下所示:

while ($return = mysql_fetch_assoc($select)) {

    echo $return['first name']." ".$return['last name']." likes ".$return['hobby']."<br/>\n";

}