从表1中选择类别和从表2中选择产品?

时间:2012-04-21 06:00:48

标签: asp.net sql select

我需要显示一些产品列表。 我有2个表,一个包含categories,另一个包含所有products

我需要显示这个结构:

list 1.
write - categories_id from categories table
write - list of products with the above categories_id from products table
end of list

next list2.
write - next categories_id from categories table
write - list of products with the above list2 categories_id from products table
end of list

依旧......

所以我需要从产品表中选择所有categories_id和所有匹配的categories_id。

这样做的最佳方式是什么? 我应该从categories然后在do中选择所有内容,直到...选择所有产品...或?

假设类别表中有4个类别,因此它应显示4个列表,每个列表中包含10个产品。 我的sql看起来像这样:

sql3 = "SELECT * from categories c inner join products p on c.categories_id = p.categories_id where p.userid ='1' group by c.categories_id order by c.categories_id;"

and the do until looks like:
do until rs.eof
rs("categoriName")

rs("productsName")

rs.movenext
loop

但这会生成4个列表,每个列表中只有1个产品?

好的,我的表看起来像这样:

categories table:
categories_id, userId, categoriesName

products table:
products_id, user_id, categories_id, productsName


And the do:
<% do until rs.eof %>
Categori: <%=rs("categoriesName")%>

Product:<%=rs("productsName")%>
<% rs.movenext
loop %>

列表应如下所示:

(list 1)
Categori: Phones
Product: iPhone
Product: Samsung
Product: Nokia

(list 2)

Categori: Tvs
Product: Philips
Product: Sony
Product: Sharp

也许我只是想错误尝试在一个选择中执行此操作,也许我只需要两个选择,第一个选择类别名称并循环通过该循环内部,选择产品。?

1 个答案:

答案 0 :(得分:0)

以下是一个查询,它将使用相应的产品获取所有类别:

SELECT
    c.CategoryName, P.ProductName, p.Price, ... //What data you want to select
FROM
    CategoriesList c
INNER JOIN 
    Products p ON c.Id = p. CategoryId
ORDER BY 
    c.CategoryName, p.ProductName

这是获取数据的最佳方式。然后,您可以按照您将要使用此查询的应用程序的方式输出这些结果,例如,在您的情况下,您应该将第一个categoryname打印为标题,然后将其products列表打印为子项,等等上。

更新:例如,您可以在控制台应用程序中输出它们:

foreach( var category in categoriesList)
{
    Console.WriteLine("(List {0})", category.Id);
    Console.WriteLine("Category: {0}", category.Name);
    foreach(var product in category.Products)
    {
         Console.WriteLine("Product: {0}", product.Name); 
    }
}

这应该打印:

(list 1)
Category: Phones
Product: iPhone
Product: Samsung
Product: Nokia
(list 2)
Category: Tvs
Product: Philips
Product: Sony
Product: Sharp
...

请注意:来自数据库的数据是表格数据:

 CategoryId  | CategoryName  |  ProductName |
-------------+---------------+--------------+
      1           Phones          iPhone
      1           Phones          Samsung  
     ...

此处数据库角色已经结束,因为数据库不是关于如何表示数据或数据的外观。这应该在您的应用程序端完成。您应该以 Cateogry-&gt;产品列表的形式获取对象关系结构列表,具体取决于您的数据访问层(Ado.net,LINQ to SQL等)。以linq为例,你应该这样做:

var CategoriesWithProducts = Categories.Join(
Products,
c => .Id,
p => p.CategoryId,
(Category, Products) =>
   new
   {
       Category = category,
       ItsProducts = products 
   });

foreach( cateogyr in CategoriesWithProducts)
{
   Console.WriteLine("(List {0})", category.Id);
   Console.WriteLine("Category: {0}", category.Name);
   foreach(var product in category.ItsProducts)
   {
         Console.WriteLine("Product: {0}", product.Name); 
   }
}

如果您使用ADO.net或任何其他DAL并且无法以关系方式获取这些结果,那么您应该手动执行此操作,即:对于每行数据仅输出类别名称然后列出他们的相应产品。

这是您应该考虑数据表示的方式,始终格式化数据以及它在应用程序的表示层中的样子,而不是数据库方面。

希望这会有所帮助。