2013-07-19 103 views
1

所以我拥有的很简单。 我有1台从数据库中获取数据的最有效方法

CategorieMain

CatMainid

CatMainName

和1台:

CategorieSub

CATID

CatName

CatMainId

'

我要的是:

一个包含所有CatMainName名称和所有CatSubNames名称下的列表。

CatMainId1

所有CatSubNames与CatMainId1

CatMainId2

所有CatSubNames与CatMainId2

等等等等

目前我使用PHP来得到这样

SELECT * from Categoriemain 

的数据和while循环我做

SELECT * FROM CategorieSub WHERE CatMain id = $row['CatMainId'] 

但是,这是非常低效的,因为现在如果我有10级CatMainId的我做10个查询的(每一段时间)

什么是最有效的方式来得到这样的列表,我正在考虑把它放在数组或什么东西,但我不能得到它的工作?

+1

用于在while循环中实现查询的+1是一件坏事':'' – Bojangles

+0

您想了解“SQL JOIN”。网络上肯定会有一些很好的教程。 –

回答

0

使用一个查询:

SELECT Categoriemain.*, CategorieSub.CatSubNames FROM Categoriemain 
JOIN CategorieSub ON Categoriemain.CatMainid=CategorieSub.Catmainid 

编辑,删除GROUP BY

有了这个查询,你不需要while循环。

我还将CatSubNames添加到查询字段的输出列表中。

+0

只给出1结果。 –

+0

好的,删除了“GROUP BY”。如果您想更好地理解您的输出,您还可以添加@Randy所示的ORDER BY。 – Sablefoste

0
SELECT * FROM Categoriemain 
JOIN CategorieSub ON Categoriemain.CatMainid=CategorieSub.Catmainid 
ORDER BY Categoriemain.CatMainid 
+0

确定,但我怎么能在while循环的CatMainName下选择合适的CategorieSub我可以用,而($行= $ result-> FETCH_ASSOC())获得CatMainNames \t \t \t \t { \t \t \t \t \t \t \t \t \t \t echo $ row ['CatMainName']; \t \t \t \t} –

+1

有变量,你将存储目前主要类别,然后你做一个检查,看是否该类别发生了变化,如果有,你只需创建一个新的HTML部分或标题,并给变量新的价值,只是一个建议,你会更好,如果这可以用SQL来完成,有什么建议吗? –

+0

对一行重复部分的抑制可以使用WINDOW函数完成 - 但我不确定这是否可用于mysql - 这在Oracle和其他平台中是肯定的。 @Hosea Kambonde建议,我认为最简单的方法是在显示代码中删除不需要的重复 – Randy

相关问题