我有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
.
.
.
我该怎么做?
答案 0 :(得分:4)
您应该添加WHERE
子句以指定ID,而在select子句中,您可能希望使用c.*
而不是p.*
来获取类别中的所有数据。
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
答案 1 :(得分:0)
如果您不想要产品记录的冗余,换句话说,您只需要类别信息而不是其他内容,那么您首先不需要加入主产品表(假设您正在使用产品ID)。
但是,您遇到的问题是,除非您计划为每个可能的类别显示列,以及产品是否包含该列,否则您将需要进行解决方案。我首选的方法是创建一个遍历每一行的游标,并将给定产品ID的类别拉入一个字符串,并将此字符串放入一个新表(产品ID,类别)。
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
注意:这还没有经过测试,但我认为如果您愿意返回一张产品ID作为您的身份并且类别为字符串。
答案 2 :(得分:-1)
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