Php 从sql结果中复制信息
我在这里查看了大约18篇其他帖子,大多数人都在问如何删除这些记录,而不仅仅是隐藏它们。所以我的问题是:我有一个数据库,里面有与地点相关的工作人员。许多工作人员与不止一个地点有联系。我想做的是只显示mysql结果中列出的第一个位置,并跳过其他位置。我使用sql查询将这些表链接在一起,并且它在旁边工作,多次显示位于这些其他位置的员工的相同信息,因此示例如下: 这是我目前使用的sql语句Php 从sql结果中复制信息,php,mysql,Php,Mysql,我在这里查看了大约18篇其他帖子,大多数人都在问如何删除这些记录,而不仅仅是隐藏它们。所以我的问题是:我有一个数据库,里面有与地点相关的工作人员。许多工作人员与不止一个地点有联系。我想做的是只显示mysql结果中列出的第一个位置,并跳过其他位置。我使用sql查询将这些表链接在一起,并且它在旁边工作,多次显示位于这些其他位置的员工的相同信息,因此示例如下: 这是我目前使用的sql语句 SELECT staff_tbl.staffID, staff_tbl.firstName, staff
SELECT staff_tbl.staffID, staff_tbl.firstName, staff_tbl.middleInitial, staff_tbl.lastName,
location_tbl.locationID, location_tbl.staffID,
officelocations_tbl.locationID, officelocations_tbl.officeName, staff_title_tbl.title_ID,
staff_title_tbl.staff_ID, titles_tbl.titleID, titles_tbl.titleName
FROM staff_tbl
INNER JOIN location_tbl ON location_tbl.staffID = staff_tbl.staffID
INNER JOIN officelocations_tbl ON location_tbl.locationID = officelocations_tbl.locationID
INNER JOIN staff_title_tbl ON staff_title_tbl.staff_ID = staff_tbl.staffID
INNER JOIN titles_tbl ON staff_title_tbl.title_ID = titles_tbl.titleID
我的php是
<?php do { ?>
<tr>
<td><?php echo $row_rs_Staff_Info['firstName']; ?> <?php echo $row_rs_Staff_Info['lastName']; ?></td>
<td><?php echo $row_rs_Staff_Info['titleName']; ?> </td>
<td><?php echo $row_rs_Staff_Info['officeName']; ?> </td>
</tr>
<?php } while ($row_mysqlResult = mysql_fetch_assoc($rs_mysqlResult)); ?>
我想知道的是,有一种方法可以使用php只选择每个人列出的第一个条目,并显示该条目,然后跳过其他两个条目。我在想,可以通过向数组中添加staffID来完成,如果它们在数组中,则跳过staffID在staff_title_tbl中列出的下一个,但不确定如何以这种方式编写。任何帮助都会很好,请提前向您表示感谢。您可以使用
位置\u tbl
上的子查询为每位员工选择一个位置
SELECT staff_tbl.staffID,
staff_tbl.firstName,
staff_tbl.middleInitial,
staff_tbl.lastName,
location_tbl.locationID,
location_tbl.staffID,
officelocations_tbl.locationID,
officelocations_tbl.officeName,
staff_title_tbl.title_ID,
staff_title_tbl.staff_ID,
titles_tbl.titleID,
titles_tbl.titleName
FROM staff_tbl
INNER JOIN
(
select max(locationID) locationID, staffID
from location_tbl
group by staffID
) location_tbl
ON location_tbl.staffID = staff_tbl.staffID
INNER JOIN officelocations_tbl
ON location_tbl.locationID = officelocations_tbl.locationID
INNER JOIN staff_title_tbl
ON staff_title_tbl.staff_ID = staff_tbl.staffID
INNER JOIN titles_tbl
ON staff_title_tbl.title_ID = titles_tbl.titleID
您可以使用
位置\u tbl
上的子查询为每位员工仅选择一个位置
SELECT staff_tbl.staffID,
staff_tbl.firstName,
staff_tbl.middleInitial,
staff_tbl.lastName,
location_tbl.locationID,
location_tbl.staffID,
officelocations_tbl.locationID,
officelocations_tbl.officeName,
staff_title_tbl.title_ID,
staff_title_tbl.staff_ID,
titles_tbl.titleID,
titles_tbl.titleName
FROM staff_tbl
INNER JOIN
(
select max(locationID) locationID, staffID
from location_tbl
group by staffID
) location_tbl
ON location_tbl.staffID = staff_tbl.staffID
INNER JOIN officelocations_tbl
ON location_tbl.locationID = officelocations_tbl.locationID
INNER JOIN staff_title_tbl
ON staff_title_tbl.staff_ID = staff_tbl.staffID
INNER JOIN titles_tbl
ON staff_title_tbl.title_ID = titles_tbl.titleID
您可以使用mysql的DISTINCT,如下所示:
SELECT DISTINCT(staff_tbl.staffID), staff_tbl.firstName, staff_tbl.middleInitial (.. etc)
我希望这有帮助您可以使用mysql的DISTINCT,如下所示:
SELECT DISTINCT(staff_tbl.staffID), staff_tbl.firstName, staff_tbl.middleInitial (.. etc)
我希望这有助于除了使用DISTINCT(staffID)来限制重复的员工列表之外,您还可以使用一些额外的清理: 1) 使用表别名,这样就不必为每列引用整个表名 2) 选择列列表中有冗余数据: 位置待定。位置ID==办公室位置待定。位置ID 员工姓名员工身份==位置员工姓名==员工姓名员工身份 员工职称待定。职称ID==职称待定。职称ID 在联接中使用列并不意味着必须在SELECT语句中引用该列。如果这些列确实有不同的值,那么您将很难在join语句中配对这两个列 3) 不一致:您确实应该将staff_title_tbl.staff_ID重命名为just staffID,将staff_title_tbl.title_ID重命名为titleID,以便它们与另一个表的列名匹配。请注意,在下面已清理的查询中,我们如何在列名匹配的staffID和locationID上使用USING(),但在列名不匹配时必须写入更长的字符。让你的名字保持一致,这样在你的程序中,你就不必回头看表,看看你是以什么方式命名的 4) 虽然为了清晰起见,您可能希望写出内部联接,但如果愿意,您可以使用联接,因为如果没有列出其他特定联接类型,这是默认联接类型
SELECT DISTINCT(s.staffID)
,s.firstName
,s.middleInitial
,s.lastName
,l.locationID
,ol.officeName
,st.title_ID
,t.titleName
FROM staff_tbl AS s
JOIN location_tbl AS l
USING (staffID)
JOIN officelocations_tbl AS ol
USING (locationID)
JOIN staff_title_tbl AS st
ON st.staff_ID = s.staffID
JOIN titles_tbl AS t
ON st.title_ID = t.titleID
同样对于您的信息,一种在PHP中使用多行原始查询的方法,但是我很惊讶原始PHP能够工作,因为您在一个地方有名为$row\u rs\u Staff\u info的查询行集,在另一个地方有$row\u mysqlResult
<?php
$unique = array();
do {
$key = $row_mysqlResult['firstName'].$row_mysqlResult['lastName'];
//if ok being last location, newer values will overwrite old for same key
$unique[$key] = $row_rs_Staff_Info;
//OR
//if must be first location, check for key & dont overwrite if already set
if(!array_key_exists($key, $unique)){
$unique[$key] = $row_mysqlResult;
}
} while ($row_mysqlResult = mysql_fetch_assoc($rs_mysqlResult));
foreach($unique as $k => $v){?>
<tr>
<td><?php echo $v['firstName']; ?> <?php echo $v['lastName']; ?></td>
<td><?php echo $v['titleName']; ?> </td>
<td><?php echo $v['officeName']; ?> </td>
</tr>
<?php } ?>
结果(针对表格宽度编辑的某些列):
除了使用DISTINCT(staffID)来限制重复的员工列表之外,您的查询还可以使用一些额外的清理: 1) 使用表别名,这样就不必为每列引用整个表名 2) 选择列列表中有冗余数据: 位置待定。位置ID==办公室位置待定。位置ID 员工姓名员工身份==位置员工姓名==员工姓名员工身份 员工职称待定。职称ID==职称待定。职称ID 在联接中使用列并不意味着必须在SELECT语句中引用该列。如果这些列确实有不同的值,那么您将很难在join语句中配对这两个列 3) 不一致:您确实应该将staff_title_tbl.staff_ID重命名为just staffID,将staff_title_tbl.title_ID重命名为titleID,以便它们与另一个表的列名匹配。请注意,在下面已清理的查询中,我们如何在列名匹配的staffID和locationID上使用USING(),但在列名不匹配时必须写入更长的字符。让你的名字保持一致,这样在你的程序中,你就不必回头看表,看看你是以什么方式命名的 4) 虽然为了清晰起见,您可能希望写出内部联接,但如果愿意,您可以使用联接,因为如果没有列出其他特定联接类型,这是默认联接类型
SELECT DISTINCT(s.staffID)
,s.firstName
,s.middleInitial
,s.lastName
,l.locationID
,ol.officeName
,st.title_ID
,t.titleName
FROM staff_tbl AS s
JOIN location_tbl AS l
USING (staffID)
JOIN officelocations_tbl AS ol
USING (locationID)
JOIN staff_title_tbl AS st
ON st.staff_ID = s.staffID
JOIN titles_tbl AS t
ON st.title_ID = t.titleID
同样对于您的信息,一种在PHP中使用多行原始查询的方法,但是我很惊讶原始PHP能够工作,因为您在一个地方有名为$row\u rs\u Staff\u info的查询行集,在另一个地方有$row\u mysqlResult
<?php
$unique = array();
do {
$key = $row_mysqlResult['firstName'].$row_mysqlResult['lastName'];
//if ok being last location, newer values will overwrite old for same key
$unique[$key] = $row_rs_Staff_Info;
//OR
//if must be first location, check for key & dont overwrite if already set
if(!array_key_exists($key, $unique)){
$unique[$key] = $row_mysqlResult;
}
} while ($row_mysqlResult = mysql_fetch_assoc($rs_mysqlResult));
foreach($unique as $k => $v){?>
<tr>
<td><?php echo $v['firstName']; ?> <?php echo $v['lastName']; ?></td>
<td><?php echo $v['titleName']; ?> </td>
<td><?php echo $v['officeName']; ?> </td>
</tr>
<?php } ?>
结果(针对表格宽度编辑的某些列):
与其选择每个组的“第一”匹配行,不如选择工作人员的当前位置?地点是否有任何可用于此目的的信息?(与staff_title_tbl类似)您希望在名、首名、姓的concat上使用DISTICT子句。对不起,我是在手机上读到这篇文章的,所以很难编写出一个真正的答案,我会在回家时添加一个例子,如果到那时没有人回答正确,那么实际上,在staffID上的DISTINCT应该足以代替串联一个DISTINCT name。另外,当外键列与主键同名时,如staffID,您可以使用(staffID)而是在位置上_tbl.staffID=员工_tbl.staffID。