【问题标题】:Is there a way in MySQL to determine every time a record contains a value that is used for the first time?MySQL中有没有办法确定每次记录包含第一次使用的值?
【发布时间】:2016-12-20 03:52:16
【问题描述】:

每当第一次返回部门名称时,我想返回围绕部门名称的 HTML。我的代码不是如下:

SELECT
Company.CompanyID,
Company.Bio,
Company.Email,
People.LastName,
People.FirstName,
Departments.DepartmentName AS DepartmentName,
Departments.DepartmentID
FROM
Company
LEFT JOIN People USING (CompanyID)
LEFT JOIN Departments
ON Departments.DepartmentID = Company.DepartmentID
ORDER BY
Departments.DepartmentID ASC,
People.LastName ASC,
People.FirstName ASC;

它返回以下内容:

 +---------+-------------------------------------+-------------+---------+--------+--------+------------+----------+---------+------------+
    |CompanyID| Bio            | Email      |LastName|FirstName|DepartmentName|DepartmentID| 
    +---------+-------------------------------------+-------------+---------+--------+--------+------------+----------+---------+------------+
    | BK001   | Lorem Ipsum ...| e@email.com| Smith | Jay      | Finance     | 1 | 
    | BK002   | Dolor sit am ..| e@email.com| Rhays | Jim      | Marketing   | 2 | 
    | BK003   | Consectetur .. | e@email.com| Carrs | Sam      | IT          | 3 | 
    | BK004   | Sed do eiusm...| e@email.com| Webb  | Bob      | Marketing   | 2 | 
    | BK005   | Concept Phi... | e@email.com| Hart  | Rob      | Design      | 4 |

我希望它返回以下内容:

|CompanyID| Bio            | Email      |LastName|FirstName|HTML|DepartmentName|DepartmentID| 
 +---------+-------------------------------------+-------------+---------+--------+--------+------------+----------
| BK001   | Lorem Ipsum ...| e@email.com| Smith | Jay      |<div>|Finance     | 1 | 
| BK002   | Dolor sit am ..| e@email.com| Rhays | Jim      |<div>|Marketing   | 2 | 
| BK003   | Consectetur .. | e@email.com| Carrs | Sam      |<div>|IT          | 3 | 
| BK004   | Sed do eiusm...| e@email.com| Webb  | Bob      |     |Marketing   | 2 | 
| BK005   | Concept Phi... | e@email.com| Hart  | Rob      |<div>|Design      | 4 | 

【问题讨论】:

    标签: mysql sql return unique distinct


    【解决方案1】:

    使用Case 语句和Sub-Query

    SELECT CASE
             WHEN CompanyID = (SELECT Min(C.CompanyID)
                               FROM   Departments D1
                                      JOIN Company C
                                        ON d1.DepartmentID = c.DepartmentID
                               WHERE  D1.DepartmentName = Departments.DepartmentName) THEN '<div>'
             ELSE ''
           END AS HTML,
        ...
    FROM ..
    

    注意:使用Alias名称来限定列而不是写完整的表名

    【讨论】:

      【解决方案2】:

      一个选项是添加一个额外的子查询来选择第一次出现的部门。我假设CompanyID 表示将记录插入表中的时间顺序,因此这是首先出现的代理。

      使用SELECT 子句中的子查询,此选项的性能可能会更好。

      SELECT t1.CompanyID,
             t1.Bio,
             t1.Email,
             t2.LastName,
             t2.FirstName,
             CASE WHEN t4.DepartmentID IS NOT NULL THEN '<div>' ELSE '' END AS HTML,
             t3.DepartmentName AS DepartmentName,
             t3.DepartmentID
      FROM Company t1
      LEFT JOIN People t2
          ON t1.CompanyID = t2.CompanyID
      LEFT JOIN Departments t3
          ON t3.DepartmentID = t1.DepartmentID
      LEFT JOIN
      (
          SELECT d.DepartmentID, MIN(c.CompanyID) AS firstCompanyID    -- this subquery finds
          FROM Company c                                               -- the first appearance of
          LEFT JOIN Departments d                                      -- a company for a given
              ON c.DepartmentID = d.DepartmentID                       -- department
          GROUP BY d.DepartmentID
      ) t4
          ON t3.DepartmentID = t4.DepartmentID AND
             t1.CompanyID    = t4.firstCompanyID
      ORDER BY t3.DepartmentID,
               t2.LastName,
               t2.FirstName;
      

      注意:我们可以在CompanyID 列(即文本)上使用MIN 的原因是因为所有ID 的宽度都固定为5。在这种情况下,字典排序将与数字的数字排序一致,这是我们真正关心的。请注意,如果此字段的宽度不固定,这可能不起作用。

      【讨论】:

      • DepartmentID 永远不会为空。它总是返回一个值。每当 MySQL 第一次返回“Marketing”或第一次返回“IT”时,我都需要带有示例 HTML 的 html 列
      • @sjw0525 你的评论对我来说毫无意义。你试过我的查询吗?
      • 是的,每次 DepartmentID 不为空时,它都会返回一个 HTML 列,其中包含示例 HTML,即每次
      • 我又试了一次。它的 HTML 列现在显示更多示例 html,但不是第一次在查询中返回每个部门名称
      • @sjw0525 那么假设最小值CompanyID 代表第一次出现可能是不安全的。如果您可以使用有此问题的实际数据更新您的问题,也许我可以看看。或者,更好的是,使用您的数据创建一个 Fiddle 并将其添加到您的问题中。
      【解决方案3】:

      检查这个。

          SET @row_number:=0;
          SET @DepartmentName:='';
      
          select 
          CompanyID,Bio,Email,LastName,FirstName,
          CASE When row_number ='1' then '<DIV>' else '' end as 'HTML',
          HTML
          DepartmentName,
          DepartmentID
          from
          (
          SELECT
          Company.CompanyID,
          Company.Bio,
          Company.Email,
          People.LastName,
          People.FirstName,
          Departments.DepartmentName AS DepartmentName,
          Departments.DepartmentID ,
          @row_number:=CASE WHEN @DepartmentName=DepartmentName THEN @row_number+1 ELSE 1 END AS row_number 
          FROM
          Company
          LEFT JOIN People USING (CompanyID)
          LEFT JOIN Departments
          ON Departments.DepartmentID = Company.DepartmentID
          ORDER BY
          Departments.DepartmentID ASC,
          People.LastName ASC,
          People.FirstName ASC;
          )a
      

      【讨论】:

      • 我认为mysql中没有over(partion)
      • 它在每个条目的 HTML 别名列中返回示例 HTML 代码。只有当员工是其部门返回的第一条记录时,它才会返回它
      • 您可以为此添加示例数据吗? @sjw0525
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 2019-11-05
      • 2020-07-07
      • 2011-02-16
      • 1970-01-01
      • 2014-06-14
      相关资源
      最近更新 更多