Php 从sql结果中复制信息

Php 从sql结果中复制信息,php,mysql,Php,Mysql,我在这里查看了大约18篇其他帖子,大多数人都在问如何删除这些记录,而不仅仅是隐藏它们。所以我的问题是:我有一个数据库,里面有与地点相关的工作人员。许多工作人员与不止一个地点有联系。我想做的是只显示mysql结果中列出的第一个位置,并跳过其他位置。我使用sql查询将这些表链接在一起,并且它在旁边工作,多次显示位于这些其他位置的员工的相同信息,因此示例如下: 这是我目前使用的sql语句 SELECT staff_tbl.staffID, staff_tbl.firstName, staff

我在这里查看了大约18篇其他帖子,大多数人都在问如何删除这些记录,而不仅仅是隐藏它们。所以我的问题是:我有一个数据库,里面有与地点相关的工作人员。许多工作人员与不止一个地点有联系。我想做的是只显示mysql结果中列出的第一个位置,并跳过其他位置。我使用sql查询将这些表链接在一起,并且它在旁边工作,多次显示位于这些其他位置的员工的相同信息,因此示例如下:

这是我目前使用的sql语句

    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']; ?>&nbsp; <?php echo $row_rs_Staff_Info['lastName']; ?></td>
  <td><?php echo $row_rs_Staff_Info['titleName']; ?>&nbsp; </td>
  <td><?php echo $row_rs_Staff_Info['officeName']; ?>&nbsp; </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']; ?>&nbsp; <?php echo $v['lastName']; ?></td>
  <td><?php echo $v['titleName']; ?>&nbsp; </td>
  <td><?php echo $v['officeName']; ?>&nbsp; </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']; ?>&nbsp; <?php echo $v['lastName']; ?></td>
  <td><?php echo $v['titleName']; ?>&nbsp; </td>
  <td><?php echo $v['officeName']; ?>&nbsp; </td>
</tr>
<?php } ?>
结果(针对表格宽度编辑的某些列):


与其选择每个组的“第一”匹配行,不如选择工作人员的当前位置?地点是否有任何可用于此目的的信息?(与staff_title_tbl类似)您希望在名、首名、姓的concat上使用DISTICT子句。对不起,我是在手机上读到这篇文章的,所以很难编写出一个真正的答案,我会在回家时添加一个例子,如果到那时没有人回答正确,那么实际上,在staffID上的DISTINCT应该足以代替串联一个DISTINCT name。另外,当外键列与主键同名时,如staffID,您可以使用(staffID)而是在位置上_tbl.staffID=员工_tbl.staffID。