Як я магу атрымаць дадзеныя з злучаных табліц?

У мяне ёсць 3 табліцы:

products table
--------------
id
name
...


categories table
----------------
id
name
...


product_categories table
------------------------
product_id
category_id

І далучыцца да іх па гэтым запыце:

select p.*
from products p
join product_categories pc on pc.product_id = p.id
join categories c on pc.category_id = c.id

Гэты запыт вяртае некалькі запісаў прадукту ў кожную катэгорыю гэтага прадукту, але я хачу, каб атрымаць толькі адзін прадукт і некалькіх катэгорый гэтага прадукта.

Гэта мой вынік:

p.Id  p.name --> cat_id cat_name

1 product_1 --> 1 cat1
1 product_1 --> 3 cat3
1 product_1 --> 2 cat2
1 product_1 --> 6 cat6 
2 product_2 --> 5 cat5
2 product_2 --> 1 cat1 
.
.
.

І пажадана выснову:

p.Id  p.name --> cat_id cat_name,cat_id cat_name,...

1 product_1 --> 1 cat1,3 cat3,2 cat2,6 cat6 
2 product_2 --> 5 cat5,1 cat1 
.
.
.

Як я магу гэта зрабіць?

1
Я разумею, што, але замест таго, каб слупок для кожнай катэгорыі, вы былі б шчаслівыя, каб вярнуць назву прадукту і яшчэ адзін слупок, які змяшчае радок з усімі катэгорыямі для гэтага прадукта?
дададзена аўтар sr28, крыніца
Я разумею, што, але замест таго, каб слупок для кожнай катэгорыі, вы былі б шчаслівыя, каб вярнуць назву прадукту і яшчэ адзін слупок, які змяшчае радок з усімі катэгорыямі для гэтага прадукта?
дададзена аўтар sr28, крыніца
Я разумею, што, але замест таго, каб слупок для кожнай катэгорыі, вы былі б шчаслівыя, каб вярнуць назву прадукту і яшчэ адзін слупок, які змяшчае радок з усімі катэгорыямі для гэтага прадукта?
дададзена аўтар sr28, крыніца
Вы былі б шчаслівыя, якая вяртае радок з усімі катэгорыямі напрыклад "1 cat1, 3 cat3, 6 cat6"?
дададзена аўтар sr28, крыніца
Вы былі б шчаслівыя, якая вяртае радок з усімі катэгорыямі напрыклад "1 cat1, 3 cat3, 6 cat6"?
дададзена аўтар sr28, крыніца
Вы былі б шчаслівыя, якая вяртае радок з усімі катэгорыямі напрыклад "1 cat1, 3 cat3, 6 cat6"?
дададзена аўтар sr28, крыніца
дадаць WHERE дизъюнкцию. <�Код> WHERE p.id = <�некаторыя ідэнтыфікатар>
дададзена аўтар Felix Pamittan, крыніца
дадаць WHERE дизъюнкцию. <�Код> WHERE p.id = <�некаторыя ідэнтыфікатар>
дададзена аўтар Felix Pamittan, крыніца
дадаць WHERE дизъюнкцию. <�Код> WHERE p.id = <�некаторыя ідэнтыфікатар>
дададзена аўтар Felix Pamittan, крыніца
<�Код> SELECT с. * і выкарыстоўвайце WHERE раздзел
дададзена аўтар ughai, крыніца
<�Код> SELECT с. * і выкарыстоўвайце WHERE раздзел
дададзена аўтар ughai, крыніца
<�Код> SELECT с. * і выкарыстоўвайце WHERE раздзел
дададзена аўтар ughai, крыніца
Так што цяпер забяспечвае структуру табліцы з дадзенымі выбаркі (лепш зрабіць SQL скрыпкі)
дададзена аўтар Stanislovas Kalašnikovas, крыніца
Пакажыце свой выхад на дадзены момант і жаданы вынік.
дададзена аўтар Stanislovas Kalašnikovas, крыніца
Пакажыце свой выхад на дадзены момант і жаданы вынік.
дададзена аўтар Stanislovas Kalašnikovas, крыніца
Пакажыце свой выхад на дадзены момант і жаданы вынік.
дададзена аўтар Stanislovas Kalašnikovas, крыніца
Так што цяпер забяспечвае структуру табліцы з дадзенымі выбаркі (лепш зрабіць SQL скрыпкі)
дададзена аўтар Stanislovas Kalašnikovas, крыніца
якія ouptput вы хочаце паказаць яго тут. се мы будзем мець больш глыбокае разуменне
дададзена аўтар Ameya Deshpande, крыніца
@AmeyaDeshpande Я хачу вынік: Код 1 product_1 cat1, cat3, CAT2, cat6 | 2 product_2 cat5, cat1 | ...
дададзена аўтар Mike, крыніца
@ StanislovasKalašnikovas sqlfiddle
дададзена аўтар Mike, крыніца
@ Sr28 Усе катэгорыі для гэтага прадукта.
дададзена аўтар Mike, крыніца
@wewesthemenace Я хачу вынік: Код 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
дададзена аўтар Mike, крыніца
@ StanislovasKalašnikovas Я адрэдагаваў мой пытанне.
дададзена аўтар Mike, крыніца
@ StanislovasKalašnikovas Я адрэдагаваў мой пытанне.
дададзена аўтар Mike, крыніца
@ StanislovasKalašnikovas Я адрэдагаваў мой пытанне.
дададзена аўтар Mike, крыніца
@wewesthemenace Я хачу вынік: Код 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
дададзена аўтар Mike, крыніца
@ughai Я хачу вынік: Код 1 product_1 cat1, cat3, CAT2, cat6 | 2 product_2 cat5, cat1 | ...
дададзена аўтар Mike, крыніца
@ughai Я хачу вынік: Код 1 product_1 cat1, cat3, CAT2, cat6 | 2 product_2 cat5, cat1 | ...
дададзена аўтар Mike, крыніца
@ Sr28 Усе катэгорыі для гэтага прадукта.
дададзена аўтар Mike, крыніца
@ Sr28 Усе катэгорыі для гэтага прадукта.
дададзена аўтар Mike, крыніца
@ Sr28 Так, але я не хачу, надмернасць запісаў прадукту: sqlfiddle
дададзена аўтар Mike, крыніца
@ughai Я хачу вынік: Код 1 product_1 cat1, cat3, CAT2, cat6 | 2 product_2 cat5, cat1 | ...
дададзена аўтар Mike, крыніца
@AmeyaDeshpande Я хачу вынік: Код 1 product_1 cat1, cat3, CAT2, cat6 | 2 product_2 cat5, cat1 | ...
дададзена аўтар Mike, крыніца
@AmeyaDeshpande Я хачу вынік: Код 1 product_1 cat1, cat3, CAT2, cat6 | 2 product_2 cat5, cat1 | ...
дададзена аўтар Mike, крыніца
@ StanislovasKalašnikovas sqlfiddle
дададзена аўтар Mike, крыніца
@ StanislovasKalašnikovas sqlfiddle
дададзена аўтар Mike, крыніца
@wewesthemenace Я хачу вынік: Код 1 product_1 cat1, cat3, cat2, cat6 | 2 product_2 cat5, cat1 | ...
дададзена аўтар Mike, крыніца
@ Sr28 Так, але я не хачу, надмернасць запісаў прадукту: sqlfiddle
дададзена аўтар Mike, крыніца
@ Sr28 Так, але я не хачу, надмернасць запісаў прадукту: sqlfiddle
дададзена аўтар Mike, крыніца

8 адказы

Вы павінны дадаць WHERE пункт, каб паказаць ідэнтыфікатар і абярыце пункта, можа быць, вы хочаце выкарыстоўваць с. * замест р. * , каб атрымаць усе дадзеныя з катэгорый.

select p.name, c.*  
from products p
join product_categories pc on pc.product_id = p.id
join categories c on pc.category_id = c.id
where p.id = --smth
4
дададзена
OP неабходныя дадзеныя з катэгорый, а таксама
дададзена аўтар ughai, крыніца
@ Mike вы можаце паспрабаваць абярыце p.name, гр. * , каб атрымаць імя прадукту і ўсё з катэгорый, адрэдагаваны адказ.
дададзена аўтар Stanislovas Kalašnikovas, крыніца
@Stanislovas Kalašnikovas Я хачу, каб атрымаць прадукт і ўсе яго катэгорыі
дададзена аўтар Mike, крыніца

Вы павінны дадаць WHERE пункт, каб паказаць ідэнтыфікатар і абярыце пункта, можа быць, вы хочаце выкарыстоўваць с. * замест р. * , каб атрымаць усе дадзеныя з катэгорый.

select p.name, c.*  
from products p
join product_categories pc on pc.product_id = p.id
join categories c on pc.category_id = c.id
where p.id = --smth
4
дададзена
OP неабходныя дадзеныя з катэгорый, а таксама
дададзена аўтар ughai, крыніца
@ Mike вы можаце паспрабаваць абярыце p.name, гр. * , каб атрымаць імя прадукту і ўсё з катэгорый, адрэдагаваны адказ.
дададзена аўтар Stanislovas Kalašnikovas, крыніца
@Stanislovas Kalašnikovas Я хачу, каб атрымаць прадукт і ўсе яго катэгорыі
дададзена аўтар Mike, крыніца

Вы павінны дадаць WHERE пункт, каб паказаць ідэнтыфікатар і абярыце пункта, можа быць, вы хочаце выкарыстоўваць с. * замест р. * , каб атрымаць усе дадзеныя з катэгорый.

select p.name, c.*  
from products p
join product_categories pc on pc.product_id = p.id
join categories c on pc.category_id = c.id
where p.id = --smth
4
дададзена
OP неабходныя дадзеныя з катэгорый, а таксама
дададзена аўтар ughai, крыніца
@ Mike вы можаце паспрабаваць абярыце p.name, гр. * , каб атрымаць імя прадукту і ўсё з катэгорый, адрэдагаваны адказ.
дададзена аўтар Stanislovas Kalašnikovas, крыніца
@Stanislovas Kalašnikovas Я хачу, каб атрымаць прадукт і ўсе яго катэгорыі
дададзена аўтар Mike, крыніца
SELECT        Tbl_Emp.EMPId, Tbl_Customer.First_Name, Tbl_Mail_IDs.MailId
FROM          Tbl_Emp INNER JOIN
      Tbl_Mail_IDs ON Tbl_Emp.EMPId = Tbl_Mail_IDs.Id INNER     
JOIN
      Tbl_Customer ON Tbl_Mail_IDs.Id = Tbl_Customer.Customer_Id
1
дададзена
Як правіла, пазбягаць кода толькі адказы. Разгледзім даданне Апісанне , які дапамагае растлумачыць свой код. дзякуй
дададзена аўтар MickyD, крыніца
SELECT        Tbl_Emp.EMPId, Tbl_Customer.First_Name, Tbl_Mail_IDs.MailId
FROM          Tbl_Emp INNER JOIN
      Tbl_Mail_IDs ON Tbl_Emp.EMPId = Tbl_Mail_IDs.Id INNER     
JOIN
      Tbl_Customer ON Tbl_Mail_IDs.Id = Tbl_Customer.Customer_Id
1
дададзена
Як правіла, пазбягаць кода толькі адказы. Разгледзім даданне Апісанне , які дапамагае растлумачыць свой код. дзякуй
дададзена аўтар MickyD, крыніца
SELECT        Tbl_Emp.EMPId, Tbl_Customer.First_Name, Tbl_Mail_IDs.MailId
FROM          Tbl_Emp INNER JOIN
      Tbl_Mail_IDs ON Tbl_Emp.EMPId = Tbl_Mail_IDs.Id INNER     
JOIN
      Tbl_Customer ON Tbl_Mail_IDs.Id = Tbl_Customer.Customer_Id
1
дададзена
Як правіла, пазбягаць кода толькі адказы. Разгледзім даданне Апісанне , які дапамагае растлумачыць свой код. дзякуй
дададзена аўтар MickyD, крыніца

Калі вы не хочаце, надмернасць запісаў прадукцыі, іншымі словамі, вы толькі хочаце атрымаць інфармацыю пра катэгорыі і нічога больш, то вам не трэба далучыцца да табліцы асноўных прадуктаў, у першую чаргу (калі вы з дапамогай ідэнтыфікатар прадукту).

Тым не менш, вы праблема заключаецца ў тым, што калі вы не плануеце, каб адлюстраваць слупок для кожнай магчымай катэгорыі і ці з'яўляецца прадукт мае яго ці не, то вы будзеце мець патрэбу, каб зрабіць працу вакол. Мой пераважны падыход павінен быў бы стварыць курсор, які праходзіць праз кожную радок і выцягвае катэгорыі для дадзенага ідэнтыфікатара прадукту ў адзін радок і змяшчае гэты радок у новую табліцу (ідэнтыфікатар прадукту, катэгорыі).

DECLARE @productId int
DECLARE @prevProductId int
SET @prevProductId = 0
DECLARE @cid int
DECLARE @cname nvarchar(255)
DECLARE @categoryList nvarchar(max)
SET @categoryList = ''

DECLARE @ProdCatTable TABLE
(
    ProductId int,
    Categories nvarchar(max)
)

DECLARE category_cursor CURSOR FOR
SELECT pc.product_id, c.id, c.name
FROM categories c
JOIN product_categories pc
ON pc.category_id = c.id
ORDER BY pc.product_id

OPEN category_cursor

FETCH NEXT FROM category_cursor
INTO @productId, @cid, @cname

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @prevProductId = 0
    BEGIN
        SET @categoryList = @cid + ' ' + @cname
        SET @prevProductId = @productId
    END
    ELSE IF (@prevProductId <> @productId) AND @categoryList <> ''
         INSERT INTO @ProdCatTable (ProductId, Categories)
         VALUES (@prevProductId, @categoryList)
         SET @prevProductId = @ProductId
         SET @categoryList = ''
    ELSE
    BEGIN
        SET @categoryList = @categoryList + ', ' + @cid + ' ' + @cname
    END

    FETCH NEXT FROM category_cursor
    INTO @productId, @cid, @cname
END

CLOSE category_cursor
DEALLOCATE category_cursor

SELECT ProductId, Catgories
FROM @ProdCatTable

NOTE: This hasn't been tested, but I think it should work if you're happy to return a table with the product id as your identify and the categories as a string.

0
дададзена
@ Mike - Зыходзячы з каментароў вышэй, там, верагодна, будзе акуратным рашэннем для гэтага ў любым абліччы няма. Калі ў вас, магчыма, толькі 10 катэгорый, то гэта магло б быць лепш пайсці ўніз маршрут прапанаваў у маім другім пункце, які да гэтага часу не вельмі добра, але можа працаваць лепш.
дададзена аўтар sr28, крыніца
Як я ўжо сказаў, я не правяраў. Калі вы толькі робіце толькі для чытання табліц, то, магчыма, хуткая перамотка наперад курсор будзе лепш.
дададзена аўтар sr28, крыніца
Дзякуй за ваш адказ. гэта самы лепшы і аптымізаваны адказ для гэтага сцэнара? Я хачу, каб паказаць кожны прадукт з яго катэгорыямі.
дададзена аўтар Mike, крыніца

Калі вы не хочаце, надмернасць запісаў прадукцыі, іншымі словамі, вы толькі хочаце атрымаць інфармацыю пра катэгорыі і нічога больш, то вам не трэба далучыцца да табліцы асноўных прадуктаў, у першую чаргу (калі вы з дапамогай ідэнтыфікатар прадукту).

Тым не менш, вы праблема заключаецца ў тым, што калі вы не плануеце, каб адлюстраваць слупок для кожнай магчымай катэгорыі і ці з'яўляецца прадукт мае яго ці не, то вы будзеце мець патрэбу, каб зрабіць працу вакол. Мой пераважны падыход павінен быў бы стварыць курсор, які праходзіць праз кожную радок і выцягвае катэгорыі для дадзенага ідэнтыфікатара прадукту ў адзін радок і змяшчае гэты радок у новую табліцу (ідэнтыфікатар прадукту, катэгорыі).

DECLARE @productId int
DECLARE @prevProductId int
SET @prevProductId = 0
DECLARE @cid int
DECLARE @cname nvarchar(255)
DECLARE @categoryList nvarchar(max)
SET @categoryList = ''

DECLARE @ProdCatTable TABLE
(
    ProductId int,
    Categories nvarchar(max)
)

DECLARE category_cursor CURSOR FOR
SELECT pc.product_id, c.id, c.name
FROM categories c
JOIN product_categories pc
ON pc.category_id = c.id
ORDER BY pc.product_id

OPEN category_cursor

FETCH NEXT FROM category_cursor
INTO @productId, @cid, @cname

WHILE @@FETCH_STATUS = 0
BEGIN
    IF @prevProductId = 0
    BEGIN
        SET @categoryList = @cid + ' ' + @cname
        SET @prevProductId = @productId
    END
    ELSE IF (@prevProductId <> @productId) AND @categoryList <> ''
         INSERT INTO @ProdCatTable (ProductId, Categories)
         VALUES (@prevProductId, @categoryList)
         SET @prevProductId = @ProductId
         SET @categoryList = ''
    ELSE
    BEGIN
        SET @categoryList = @categoryList + ', ' + @cid + ' ' + @cname
    END

    FETCH NEXT FROM category_cursor
    INTO @productId, @cid, @cname
END

CLOSE category_cursor
DEALLOCATE category_cursor

SELECT ProductId, Catgories
FROM @ProdCatTable

NOTE: This hasn't been tested, but I think it should work if you're happy to return a table with the product id as your identify and the categories as a string.

0
дададзена
@ Mike - Зыходзячы з каментароў вышэй, там, верагодна, будзе акуратным рашэннем для гэтага ў любым абліччы няма. Калі ў вас, магчыма, толькі 10 катэгорый, то гэта магло б быць лепш пайсці ўніз маршрут прапанаваў у маім другім пункце, які да гэтага часу не вельмі добра, але можа працаваць лепш.
дададзена аўтар sr28, крыніца
Як я ўжо сказаў, я не правяраў. Калі вы толькі робіце толькі для чытання табліц, то, магчыма, хуткая перамотка наперад курсор будзе лепш.
дададзена аўтар sr28, крыніца
Дзякуй за ваш адказ. гэта самы лепшы і аптымізаваны адказ для гэтага сцэнара? Я хачу, каб паказаць кожны прадукт з яго катэгорыямі.
дададзена аўтар Mike, крыніца