我需要显示一些产品列表。
我有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
也许我只是想错误尝试在一个选择中执行此操作,也许我只需要两个选择,第一个选择类别名称并循环通过该循环内部,选择产品。?
答案 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并且无法以关系方式获取这些结果,那么您应该手动执行此操作,即:对于每行数据仅输出类别名称然后列出他们的相应产品。
这是您应该考虑数据表示的方式,始终格式化数据以及它在应用程序的表示层中的样子,而不是数据库方面。
希望这会有所帮助。