BG Development


Страници: (3) [1] 2 3   ( Първото ново мнение ) Reply to this topicStart new topicStart Poll

> MYSQL - JOIN на таблица със себе си
miss
Публикувано на: 01-08-2018, 12:21
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 19
Регистриран на: 14.04.15



Имам таблица employees с колони id, name, boss_id и таблица boss с колони id, name.
Идеята е, че всеки служител в таблица employees си има шеф от таблица boss, съответно boss_id сочи към ID в таблица boss.

Имайки ID-то на някой от служителите как мога да взема името на шефа му?

Пробвам да JOIN-a таблицата сама със себе си, но не се получава:

CODE

$id = intval($_GET['id']); // тук си записвам ID-то на работника
SELECT id, name, boss_id, (SELECT E.boss_id FROM employees E WHERE E.boss_id = '$id') FROM boss B
PMEmail Poster
Top
dvader
Публикувано на: 01-08-2018, 12:27
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 4103
Регистриран на: 12.07.05



Да започнем отдалече - къде виждаш тука JOIN?
И защо ти е да правиш JOIN на таблицата сама със себе си?


--------------------
I find your lack of faith disturbing
PM
Top
miss
Публикувано на: 01-08-2018, 12:33
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 19
Регистриран на: 14.04.15



QUOTE (dvader @ 01-08-2018, 12:27)
Да започнем отдалече - къде виждаш тука JOIN?
И защо ти е да правиш JOIN на таблицата сама със себе си?


Това ми е заявката с JOIN-a, горната заявка е друг начин, по който пробвах да постигна резултата, който търся. Копирал съм грешно заявката, но и по двата начина не ми се получава.

CODE

Select t1.id as id, t1.name as Name, t2.name as boss from employees t1
join employees t2
on t1.boss_id = t2.id


Какво предлагаш ти?

Това мнение е било редактирано от miss на 01-08-2018, 12:35
PMEmail Poster
Top
fast_user
Публикувано на: 01-08-2018, 12:47
Quote Post



Име:
Група: Потребител
Ранг: Редовен член

Мнения: 394
Регистриран на: 19.09.12



Кажи ми че пишеш на линукс. Как може да знаеш че полето boss_id сочи id от таблица boss, и въпреки това да искаш да се join-ваш към таблица различна от boss, за да вземеш стойности от boss таблицата.


--------------------
Linux is only free if your time has no value.
Linux Akbar
PMEmail Poster
Top
ldbl
Публикувано на: 01-08-2018, 12:50
Quote Post



Име: Станислав Неделчев
Група: Потребител
Ранг: Активен

Мнения: 257
Регистриран на: 22.09.07



Имаш таблица employees и boss пък правиш self join на employees

Select t1.id as id, t1.name as Name, t2.name as boss from employees t1
join boss t2
on t1.boss_id = t2.id


--------------------
PMEmail PosterUsers WebsiteICQ
Top
thrawn
Публикувано на: 01-08-2018, 12:56
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1729
Регистриран на: 17.01.17



Най вероятно става дума за някаква мърлявщина. Шефовете също са служители и нормалната имплементация е всичко да се постави в една таблица в която да има и поле boss id. Така се получава дърво (рекурсивна релация 1:1 или 1:М). Ако се налага релацията да е N:M трябва да се добави и помощна таблица.
PMEmail Poster
Top
miss
Публикувано на: 01-08-2018, 13:08
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 19
Регистриран на: 14.04.15



Повтарям въпроса си без конкретизация за ИМЕНА на таблиците.

Имам table1 с колони id, name, table2_id(foreign) и таблица table2 с колони id(primary), name

Имайки ID-то на запис от таблица table1 как мога да взема ИМЕТО, към което сочи table2_id?

Това мнение е било редактирано от miss на 01-08-2018, 13:09
PMEmail Poster
Top
thrawn
Публикувано на: 01-08-2018, 13:10
Quote Post



Име:
Група: Потребител
Ранг: Почетен член

Мнения: 1729
Регистриран на: 17.01.17



PMEmail Poster
Top
johnfound
Публикувано на: 01-08-2018, 13:15
Quote Post


Group Icon
Име:
Група: VIP
Ранг: Почетен член

Мнения: 6473
Регистриран на: 27.05.04



Класическият join:

CODE
select * from t1 left join t2 on t2.id = t1.t2_id where t1.id = ?1;


Понякога ако не ни трябват полетата от t1, може да е по-изгодно да се направи така:

CODE
select name from t2 where t2.id = (select t2_id from t1 where t1.id = ?1);


Това мнение е било редактирано от johnfound на 01-08-2018, 13:16


--------------------
asm32 - Приложно програмиране на асемблер.
Tox: 2B446ADCEC7E180CD4C59391D81D4CAB3E99CA7AE767DB3AB45AF976F8A2050FF071DDB733F1
PMEmail PosterUsers Website
Top
miss
Публикувано на: 01-08-2018, 13:19
Quote Post



Име:
Група: Потребител
Ранг: Новопостъпил

Мнения: 19
Регистриран на: 14.04.15



QUOTE (johnfound @ 01-08-2018, 13:15)
Класическият join:

CODE
select * from t1 left join t2 on t2.id = t1.t2_id where t1.id = ?1;


Понякога ако не ни трябват полетата от t1, може да е по-изгодно да се направи така:

CODE
select name from t2 where t2.id = (select t2_id from t1 where t1.id = ?1);

Точно това ми трябваше, много ти благодаря!
PMEmail Poster
Top
1 потребители преглеждат тази тема в момента (1 гости, 0 анонимни потребители)
Потребители, преглеждащи темата в момента:

Topic Options Страници: (3) [1] 2 3  Reply to this topicStart new topicStart Poll

 


Copyright © 2003-2018 | BG Development | All Rights Reserved
RSS 2.0