我有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
答案 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";
}