Автор Тема: select от много таблици  (Прочетена 4099 пъти)

edmon

  • Гост
select от много таблици
« -: Oct 03, 2014, 09:20 »
Понеже дори не мога да си формулирам правилно въпроса направо ще дам едни пример.
Ако имам една таблица с потребители, и в нея има колони с:ид, име , егн, държава, град, пол,образование,
а колконите държава, град, образование са номера от други съответни таблици, в който има колони с номер и име. Например в  държава има колони: номер, име(държава); в град също: номер, име(град).
Възможно ли е и/или как може с една еСКюеЛ заявка да се покаже:
име, държава, егн, име от таблица държава, име от таблица град, пол, име от таблица образование....

Имам проблем дори да го формулирам като въпрос на ханглийски(и на бг не мога май) та да намеря някъв пример в интернетя... :)
Активен

laskov

  • Напреднали
  • *****
  • Публикации: 3166
    • Профил
Re: select от много таблици
« Отговор #1 -: Oct 03, 2014, 09:23 »
JOIN
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

edmon

  • Гост
Re: select от много таблици
« Отговор #2 -: Oct 03, 2014, 11:05 »
JOIN

с JOIN,  ама снощи си загубих половината вечер в опити.

Като напиша :
select id,
user.ime as ime,
gradove.grad_ime as grad,
dyrjavi.gyrjava as dyrjava,
user.pol as pol
from users
inner join gradove
on user.grad_id = gradove.id
inner join dyrjavi
on user.dyrjava_id = dyrjavi.id

Нещо нИ ми се получава рабтата....
Изкарва ми всеки юзър с всеки град с всяка държава ... хиляди милиони редове...
Активен

laskov

  • Напреднали
  • *****
  • Публикации: 3166
    • Профил
Re: select от много таблици
« Отговор #3 -: Oct 03, 2014, 11:23 »
Аз бих използвал Aliases за едната таблица-резултат, но нека някой знаещ да помогне.

Може би

select t1.id, t1.ime, gradove.grad_ime as grad, t1.dyrjava, t1.pol from (
select id,
user.ime as ime,
dyrjavi.gyrjava as dyrjava,
user.pol as pol,
user.grad_id
from users
inner join dyrjavi
on user.dyrjava_id = dyrjavi.id) as t1
join gradove on t1.grad_id = gradove.id;


Едит1: добавено "за едната таблица-резултат"
Едит2: добавено предложение
Edit3: user.grad_id заменено с t1.grad_id
« Последна редакция: Oct 03, 2014, 11:57 от laskov »
Активен

Не си мислете, че понеже Вие мислите правилно, всички мислят като Вас! Затова, когато има избори, идете и гласувайте, за да не сте изненадани после от резултата, и за да не твърди всяка партия, че тя е спечелила, а Б.Б. (С.С., ...) е загубил, а трети да управлява.  Наздраве!  [_]3

luda_glawa

  • Напреднали
  • *****
  • Публикации: 652
  • Distribution: Kubuntu
  • Window Manager: KDE
    • Профил
    • WWW
Re: select от много таблици
« Отговор #4 -: Oct 03, 2014, 12:41 »
Да приемем, че таблиците са:

[users] с полета user_id, country_id, city_id, data ...;
[countries] с полета id, country_desc, data2 ...;
[cities] с полета id, city_desc, data3 ...;

То заявката би трябвало да е:
SELECT
    u.user_id,
    u.data,
    u.country_id,
    c.country_desc,
    c.data2,
    u.city_id,
    cc. city_desc,
    cc.data3
FROM [users] AS u
LEFT JOIN [countries] AS c
    ON c.id = u.country_id
LEFT JOIN [cities] AS cc
    ON cc.id = u.city_id
WHERE ....

По този начин ще ти изведе всички потребители, като им попълни данните, ако ги има въведени. Това при положение, че структурата на таблиците е като горната, инак може да се наложи да използваш GROUP BY.
Активен

С Уважение:

Luda Glawa ;-)

dexxa

  • Напреднали
  • *****
  • Публикации: 26
    • Профил
Re: select от много таблици
« Отговор #5 -: Oct 03, 2014, 14:44 »
@edmon, Вашият селект, при мен, работи коректно (на оракъл).
Пробвах да го счупя, като в едната таблица полето grad_id е 'number', а в другата - 'varchar'.
Пак работи коректно.
Единственото, което роди главата ми е, че има ид-та на градове и/или държави, които не са уникални.
Може и без JOIN, но е по-бавно:
select username,
(select grad_name from GRADOVE where grad_id=u.grad),
(select strana_name from DARJAVI where strana_id=u.strana)
 from USERS u
« Последна редакция: Oct 03, 2014, 14:52 от dexxa »
Активен

borovaka

  • Напреднали
  • *****
  • Публикации: 1331
  • Distribution: Каквото дойде
  • Window Manager: Gnome / KDE
    • Профил
Re: select от много таблици
« Отговор #6 -: Oct 03, 2014, 18:55 »
Тоя INNER можеш ли да ми кажеш защо точно го използваш?
В случая ти трябва LEFT JOIN (LEFT за да имаш все пак резултат, ако липсват данни в някоя от таблиците).
След това сложи alias-i на самите имена та таблиците в WHERE и JOIN и в SELECT-a описвай нужните колони с tablealias.columnname

п.с.
@laskov Не е много-препоръчително ползването на SELECT-и от темп таблици без да е наложително (макар, че имаш optimizer при MySQL при по-стара версия от 5.6 е супер дървен), за такова Query изобщо няма файда.
« Последна редакция: Oct 03, 2014, 19:01 от borovaka »
Активен

Та извода е прост: "Колкото по-големи ла*ната - толкова по-малка щетата! ... моралната де, не материалната"

edmon

  • Гост
Re: select от много таблици
« Отговор #7 -: Oct 03, 2014, 23:44 »
Тоя INNER можеш ли да ми кажеш защо точно го използваш?
В случая ти трябва LEFT JOIN (LEFT за да имаш все пак резултат, ако липсват данни в някоя от таблиците).
След това сложи alias-i на самите имена та таблиците в WHERE и JOIN и в SELECT-a описвай нужните колони с tablealias.columnname

п.с.
@laskov Не е много-препоръчително ползването на SELECT-и от темп таблици без да е наложително (макар, че имаш optimizer при MySQL при по-стара версия от 5.6 е супер дървен), за такова Query изобщо няма файда.

Ми ласков ми даде пример и го използвах от там,
иначе съм се пробвал и с ляф джойн, пак не ми се получаваше.
Задължително ли е да имам WHERE?

PS. Явно снощи много ми се е спяло и съм правил нещо, което сега не мога
да повторя, в смисъл , сега нещото работи, а тогава не ми работеше....
« Последна редакция: Oct 04, 2014, 00:12 от edmon »
Активен

borovaka

  • Напреднали
  • *****
  • Публикации: 1331
  • Distribution: Каквото дойде
  • Window Manager: Gnome / KDE
    • Профил
Re: select от много таблици
« Отговор #8 -: Oct 03, 2014, 23:51 »
WHERE не, но при ON минимално да окажеш поле на релацията.
Активен

Та извода е прост: "Колкото по-големи ла*ната - толкова по-малка щетата! ... моралната де, не материалната"