2016-12-20 14 views
3

Я хочу возвращать HTML, окружающий имя отдела, каждый раз, когда это имя отдела, которое возвращается в первый раз. Мой код прямо не есть ниже:Есть ли способ в MySQL определять каждый раз, когда запись содержит значение, которое используется в первый раз?

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 ...| [email protected]| Smith | Jay  | Finance  | 1 | 
    | BK002 | Dolor sit am ..| [email protected]| Rhays | Jim  | Marketing | 2 | 
    | BK003 | Consectetur .. | [email protected]| Carrs | Sam  | IT   | 3 | 
    | BK004 | Sed do eiusm...| [email protected]| Webb | Bob  | Marketing | 2 | 
    | BK005 | Concept Phi... | [email protected]| Hart | Rob  | Design  | 4 | 

Я хотел бы, чтобы вернуть следующее:

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

ответ

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 имени квалифицироваться столбцами вместо того, чтобы писать полное имя табличных

0

Один из вариантов, чтобы добавить дополнительный подзапрос, чтобы выбрать первое вхождение отдела. Я предполагаю, что 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; 

Примечание: Причина мы можем уйти с использованием MIN на CompanyID колонке, что текст, потому, что ширина всех идентификаторов фиксируются как пять. В этом случае лексикографическая сортировка будет согласовываться с цифровой сортировкой цифр, и это то, что нас действительно волнует. Обратите внимание, что это может не сработать, если ширина этого поля не была исправлена.

+0

DepartmentID никогда не имеет значения. Он всегда возвращает значение. Мне нужен этот столбец html с образцом HTML всякий раз, когда MySQL в первый раз возвращает «Маркетинг» или «IT» – sjw0525

+0

@ sjw0525 Ваш комментарий не имеет для меня никакого смысла. Вы пробовали мой запрос? –

+0

yes и он возвращает столбец HTML с образцом HTML в нем каждый раз, когда DepartmentID не является нулевым, что есть каждый раз – sjw0525

0

Проверьте это.

+0

Я не думаю, что в mysql есть более (partion) – sjw0525

+0

Он возвращает образец HTML-кода в столбце псевдонима HTML для каждой записи. Он не возвращает его только в том случае, если работник является первой записью, возвращенной с их отделением – sjw0525

+0

. Можете ли вы добавить примеры данных для этого. @ sjw0525 –