21

Re: MySQL БД працівники

Звичайно, супер коли:
Петрунько Петро Петрович:
мив унітази - 4 роки
замітав- 5 років
керував лосями - 2 роки
начальник - 1 рік
Але який раз пояснюю, в мене в БД таких даних НАЖАЛЬ не має і не буде. Я розумію, що "СТАЖ" - 30 років, виглядає м'яко кажучи "цікаво". Ким був 30 років??? Все, що є в таблиці термін влаштування на роботу і все.

22

Re: MySQL БД працівники

Така таблиця згодиться хіба що для студента... в реальному житті вона навряд чи буде корисною.

23

Re: MySQL БД працівники

fed_lviv написав:

Звичайно, супер коли:
Петрунько Петро Петрович:
мив унітази - 4 роки
замітав- 5 років
керував лосями - 2 роки
начальник - 1 рік
Але який раз пояснюю, в мене в БД таких даних НАЖАЛЬ не має і не буде. Я розумію, що "СТАЖ" - 30 років, виглядає м'яко кажучи "цікаво". Ким був 30 років??? Все, що є в таблиці термін влаштування на роботу і все.

fed_lviv, ви якось надто вже переймаєтесь нормальною критикою у ваш бік. Ніхто нічого вас не змушує робити. Хочете так - прийнято, вам порад більше не давати.

24

Re: MySQL БД працівники

ktretyak написав:

Така таблиця згодиться хіба що для студента... в реальному житті вона навряд чи буде корисною.

Тут з Вами згідний.

ktretyak написав:

fed_lviv, ви якось надто вже переймаєтесь нормальною критикою у ваш бік.

Я не переймаюсь критикой, я тількии за критику. А ось:

ktretyak написав:

Цікаво скільки ще пройде часу, щоб ви зважали на поради більш досвідчених людей, в цьому плані?

З ци я і не згідний.

ktretyak написав:

Хочете так - прийнято, вам порад більше не давати.

Ваше право.

25

Re: MySQL БД працівники

Оскільки це не особиста переписка з автором теми, то дозволю собі додати ще одну ідею для тих, кому це цікаво.

Можна зробити так:
1. перша таблиця з поточною картиною штату працівників, в якій є поле date_from - тобто дата, з якої вступають зміни в силу;
2. друга - історична таблиця, в якій є повний перелік полів з першої таблиці, плюс поле date_to - тобто дата, з якої ці зміни стають неактуальними.

В першу таблицю записи вставляються, коли з'являються зміни, а в другу - коли ці зміни стають неактуальними, ну і відповідно вони ж видаляються з першої таблиці.

В такому разі SQL-запити значно спрощуються, відносно попередньої моєї ідеї з історичною таблицею.

26

Re: MySQL БД працівники

[кхм], в другу таблицю переміщуються записи не лише коли зміни втратили актуальність, а і взагалі - коли будь-яка зміна відбулась, яку потрібно показати в поточній картині штату працівників.

Наприклад, якщо якась жінка вийшла заміж і змінила прізвище, то це важливо показати в таблиці працівників. Хоча ця подія не змінює її посади, але все одно - запис із дівочим прізвищем потрібно переміщувати в історичну таблицю і проставляти дату date_to.

27

Re: MySQL БД працівники

ktretyak написав:

[кхм], в другу таблицю переміщуються записи не лише коли зміни втратили актуальність, а і взагалі - коли будь-яка зміна відбулась, яку потрібно показати в поточній картині штату працівників.

Наприклад, якщо якась жінка вийшла заміж і змінила прізвище, то це важливо показати в таблиці працівників. Хоча ця подія не змінює її посади, але все одно - запис із дівочим прізвищем потрібно переміщувати в історичну таблицю і проставляти дату date_to.

Кхм, пане ktretyak, ви раптом в СБУ не підробляєте,... збираємо всі дані які є :) ... родичі за кордоном? закордонні кредити, чи можливо житло там-же :)

28 Востаннє редагувалося fed_lviv (20.07.2015 12:21:06)

Re: MySQL БД працівники

Підкажіть будь-ласка, як зробити запит НАЙМОЛОДШОГО ПРАЦІВНИКА. Роблю,ось так:

SELECT    
    CONCAT_WS(' - ',
        CONCAT_WS(' ', staff.lastName, staff.firstName, staff.middleName),
        CONCAT_WS(' ', TIMESTAMPDIFF(YEAR, staff.birthday, CURDATE()), 'років')    
    )
FROM    
    staff
ORDER BY
    staff.birthday DESC
LIMIT 1;

Але проблема, в тому, якщо дати днів народжень співпадають, у двох або більше людей, то запит всерівно поверне тільки одну особу. Як правильно скласти запит?
P.S. Не дивуйтеся 3 CONCAT_WS(), потрібно результат запиту отримувати в одній колонці, кількість рядків не лімітується, а ось колонка має бути тільки одна.

29

Re: MySQL БД працівники

Можна спробувати зробити з підзапитом — тоді знайде всіх наймолодших працівників, що народились у той же день:

SELECT    
    CONCAT_WS(' - ',
        CONCAT_WS(' ', staff.lastName, staff.firstName, staff.middleName),
        CONCAT_WS(' ', TIMESTAMPDIFF(YEAR, staff.birthday, CURDATE()), 'років')    
    )
FROM    
    staff
WHERE staff.birthday IN 
(SELECT birthday FROM staff 
ORDER BY
    staff.birthday DESC
LIMIT 1);

30

Re: MySQL БД працівники

Ааааааааа! [Err] 1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'

31

Re: MySQL БД працівники

Якщо замість «IN» написати «=», теж лається?

32

Re: MySQL БД працівники

Або краще зробити так:

SELECT    
    CONCAT_WS(' - ',
        CONCAT_WS(' ', staff.lastName, staff.firstName, staff.middleName),
        CONCAT_WS(' ', TIMESTAMPDIFF(YEAR, staff.birthday, CURDATE()), 'років')    
    )
FROM    
    staff
JOIN 
(SELECT birthday FROM staff 
ORDER BY
    staff.birthday DESC
LIMIT 1) youngest ON staff.birthday=youngest.birthday;

33

Re: MySQL БД працівники

Вельми вдячний, останній запит так само, як заміна IN на "=" працює. Тепер буду розбиратися в другому запиті, а то сильно розумний той запит. Перший з заміною на "=" легше мною читається.

34

Re: MySQL БД працівники

Все ж таки 1 варіант мені більш сподобався, трошки підрехтував, щоб легше читалося:

SELECT    
    CONCAT_WS(' - ',
        CONCAT_WS(' ', staff.lastName, staff.firstName, staff.middleName),
    CONCAT_WS(' ', TIMESTAMPDIFF(YEAR, staff.birthday, CURDATE()), 'років')    
    )
FROM    
    staff
WHERE 
    staff.birthday =
        (
            SELECT 
                MAX(staff.birthday) 
            FROM 
                staff 
        );

Не знаю, що краще по швидкості, але читається даний варіант, найлегше.

35 Востаннє редагувалося fed_lviv (21.07.2015 18:48:47)

Re: MySQL БД працівники

Роблю запит ПОСАДА/КІЛЬКІСТЬ. Групую посади, якщо посада NULL - прописую решта. Сортую кількість по спаданню + внизу РЕШТА. Проблема виникає, додати останній рядок ВСЬОГО-СУМА. WITH ROLLUP не можу використовувати бо використовую сортування. Як можна обійти проблему?

SELECT
    CONCAT_WS(' - ',
        IFNULL(profession.specialty, 'решта'),
        COUNT(*)
    )
FROM 
    profession RIGHT JOIN staff USING (idProfession)
GROUP BY
    profession.specialty
ORDER BY
    profession.specialty IS NULL,
    COUNT(*) DESC;
Post's attachments

1.jpg 35.17 kb, 189 downloads since 2015-07-21 

36 Востаннє редагувалося P.Y. (22.07.2015 05:09:44)

Re: MySQL БД працівники

Мається на увазі загальна сума працівників? Тоді можна просто дописати вкінці запиту:
[code=sql]union select concat_ws(' - ', '***ВСЬОГО***', count(*)) from staff[/code]

37

Re: MySQL БД працівники

UNION я вже пробував, сортування збивалося.

38 Востаннє редагувалося P.Y. (22.07.2015 12:59:02)

Re: MySQL БД працівники

Спробуйте ще union all — тоді результати запитів просто зліплюються один під одним без додаткового перемішування й виключення дублікатів.

Хоча ні, так не вийде... Треба запхнути перший сортований запит у підзапит, і вже з ним робити селект з юніоном:

39

Re: MySQL БД працівники

[code=sql]select * from
(SELECT
    CONCAT_WS(' - ',
        IFNULL(profession.specialty, 'решта'),
        COUNT(*)
    )
FROM
    profession RIGHT JOIN staff USING (idProfession)
GROUP BY
    profession.specialty
ORDER BY
    profession.specialty IS NULL,
    COUNT(*) DESC) subrequest
union all  select concat_ws(' - ', '***ВСЬОГО***', count(*)) from staff[/code]

Подякували: fed_lviv1

40

Re: MySQL БД працівники

Вибачаюсь за паузу, не був на місці. Щойно, спробував запит - все тіп-топ. Сердечно дякую!