Php 将mysql结果按类别分组,并将其显示为每个类别下的组
我试图创建一个简单的css菜单,从mysql表中获取数据 我的想法是有这样的菜单Php 将mysql结果按类别分组,并将其显示为每个类别下的组,php,mysql,Php,Mysql,我试图创建一个简单的css菜单,从mysql表中获取数据 我的想法是有这样的菜单 Category 1 - link 1 - link 2 - link 3 Category 2 - link 1 - link 2 - ect... <ul class="menu"> <li id="category1" class="files"> <a href="#category1"
Category 1
- link 1
- link 2
- link 3
Category 2
- link 1
- link 2
- ect...
<ul class="menu">
<li id="category1" class="files">
<a href="#category1">Category 1</a>
<ul class="sub-menu">
<li><a href="#">link 1</li>
<li><a href="#">link 2</li>
<li><a href="#">link 3</li>
</ul>
</li>
<li id="category2" class="files">
<a href="#category2">Category 2</a>
<ul class="sub-menu">
<li><a href="#">link 1</li>
<li><a href="#">link 2</li>
<li><a href="#">link 3</li>
</ul>
</li>
</ul>
CREATE TABLE IF NOT EXISTS `content` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`menu_name` text,
`menu_name_en` text,
`menu_url` varchar(255) NOT NULL DEFAULT '',
`header_name` text,
`header_name_en` enum('MEDIA','GENERAL') NOT NULL DEFAULT 'MEDIA',
`text` longtext NOT NULL,
`text_en` text,
`category` enum('Category 1', 'Category 2') NOT NULL DEFAULT 'Category 1',
`date` date NOT NULL DEFAULT '0000-00-00',
`visible` char(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
);
INSERT INTO content (id, menu_name, menu_name_en, menu_url, header_name, header_name_en, text, text_en, category, date, visible) VALUES (26, 'test name', '', 'test_url', 'test name', '', '<p>test text</p>', '<p>text text</p>', 'MEDIA', '2014-02-23', '1');
每个链接都有一个名为“category”的字段。因此,我想分组并显示每个类别菜单中的链接
我有一个类似的例子
$sql = "SELECT * FROM content group by category";
$result = mysql_query($sql);
然后我有了这样的html
Category 1
- link 1
- link 2
- link 3
Category 2
- link 1
- link 2
- ect...
<ul class="menu">
<li id="category1" class="files">
<a href="#category1">Category 1</a>
<ul class="sub-menu">
<li><a href="#">link 1</li>
<li><a href="#">link 2</li>
<li><a href="#">link 3</li>
</ul>
</li>
<li id="category2" class="files">
<a href="#category2">Category 2</a>
<ul class="sub-menu">
<li><a href="#">link 1</li>
<li><a href="#">link 2</li>
<li><a href="#">link 3</li>
</ul>
</li>
</ul>
CREATE TABLE IF NOT EXISTS `content` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`menu_name` text,
`menu_name_en` text,
`menu_url` varchar(255) NOT NULL DEFAULT '',
`header_name` text,
`header_name_en` enum('MEDIA','GENERAL') NOT NULL DEFAULT 'MEDIA',
`text` longtext NOT NULL,
`text_en` text,
`category` enum('Category 1', 'Category 2') NOT NULL DEFAULT 'Category 1',
`date` date NOT NULL DEFAULT '0000-00-00',
`visible` char(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
);
INSERT INTO content (id, menu_name, menu_name_en, menu_url, header_name, header_name_en, text, text_en, category, date, visible) VALUES (26, 'test name', '', 'test_url', 'test name', '', '<p>test text</p>', '<p>text text</p>', 'MEDIA', '2014-02-23', '1');
-
-
- 链接1
- 链接2
- 链接3
db表如下所示
Category 1
- link 1
- link 2
- link 3
Category 2
- link 1
- link 2
- ect...
<ul class="menu">
<li id="category1" class="files">
<a href="#category1">Category 1</a>
<ul class="sub-menu">
<li><a href="#">link 1</li>
<li><a href="#">link 2</li>
<li><a href="#">link 3</li>
</ul>
</li>
<li id="category2" class="files">
<a href="#category2">Category 2</a>
<ul class="sub-menu">
<li><a href="#">link 1</li>
<li><a href="#">link 2</li>
<li><a href="#">link 3</li>
</ul>
</li>
</ul>
CREATE TABLE IF NOT EXISTS `content` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`menu_name` text,
`menu_name_en` text,
`menu_url` varchar(255) NOT NULL DEFAULT '',
`header_name` text,
`header_name_en` enum('MEDIA','GENERAL') NOT NULL DEFAULT 'MEDIA',
`text` longtext NOT NULL,
`text_en` text,
`category` enum('Category 1', 'Category 2') NOT NULL DEFAULT 'Category 1',
`date` date NOT NULL DEFAULT '0000-00-00',
`visible` char(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
);
INSERT INTO content (id, menu_name, menu_name_en, menu_url, header_name, header_name_en, text, text_en, category, date, visible) VALUES (26, 'test name', '', 'test_url', 'test name', '', '<p>test text</p>', '<p>text text</p>', 'MEDIA', '2014-02-23', '1');
创建表(如果不存在)`content`(
`id`int(11)非空自动增量,
`菜单名称`文本,
`菜单名称文本,
`菜单url`varchar(255)非空默认值“”,
`标题_name`文本,
`标题\u name \u en`enum('MEDIA','GENERAL')不为空默认的'MEDIA',
`text`longtext不为空,
`text_en`text,
`类别'enum('category 1','category 2')不为空默认为'category 1',
`日期'date NOT NULL默认值'0000-00-00',
`可见的'char(1)非空默认值'0',
主键(`id`)
);
在内容(id、菜单名称、菜单名称、菜单url、标题名称、标题名称、文本、文本、类别、日期、可见)中插入值(26,“测试名称”、“测试url”、“测试名称”、“测试文本”、“文本””、“媒体”、“2014-02-23”、“1”);
因此,我很难将结果放入循环并按类别创建html
我在这里读了很多内容相似的帖子,但都没有达到我想要的效果。
任何帮助都将不胜感激。谢谢 我会使用
按类别排序
。然后可以像下面这样迭代结果集
$old = null;
foreach ($st as $s) {
if $old != $s['id']
echo 'Main category';
$old = $s['id'];
echo 'subcategory'
更新
到目前为止,这个问题本身有三种可能的解决方案
原始选择1
如果只想获取每个父类别一次,则应使用
DISTINCT
。在未使用任何聚合函数的情况下,不应使用分组依据。将groupby
与SELECT*
相结合仅限于(大部分)MySQL。在这种情况下,不能在ASNI SQL中选择任意列
备选方案1的一个变体
这是使用DISTINCT
而不是GROUP BY
的更正版本
它仍然缺少嵌套查询调用。对于5个父类别,这将导致循环中出现5个查询。对于10个父类别,其中已经有10个查询。一般来说,我们应该避免这种增长
选择3
与上面的代码一起使用
由于不同的原因,这比显示的其他选项更可取:
- 一次只需一个数据库查询即可收集所有数据。数据库(用于简单查询)大部分时间用于解析提供的SQL语句,而实际收集所请求数据的时间仅为一小部分。如果您提供了大量的SQL代码,那么它必须花费大量的时间对其进行解析。如果您提供的代码更少,那么它所要做的事情就更少
- 数据库只需获取一次数据,对其进行一次排序并返回给您一次,而不是收集一个零件,对一个零件进行排序,返回一个零件然后重新开始
尚未说明的备选方案4
存在一个迄今尚未说明的进一步解决方案。可以使用准备好的语句,准备SQL一次,并使用不同的ID运行它。这仍然可以查询循环中的所有类别,但可以避免每次都需要解析SQL代码
实际上,我不知道这比我的解决方案好还是坏(或介于两者之间)。你的问题是错误的
$sql = "SELECT * FROM content WHERE group by category";
应该是
$sql = "SELECT * FROM content group by category";
此外,由于mysql已被弃用,请避免使用它。改为使用mysqli或PDOSQLgroupby
语句对结果进行分组,以便每个类别只返回一行。这通常与诸如count()之类的聚合函数结合使用,以计算每个类别中有多少项。
正如GhostGambler所说,您需要的是一个按
排序的,或者一个针对每个类别的单独查询,如下所示。然而,由于您似乎只有两个类别,这种方法似乎不必要地复杂
$q=$db->query("SELECT DISTINCT category FROM content ORDER BY category");
foreach($q as $cat){
echo '<li id="'.$cat['category'].'" class="files">';
echo '<a href="'.$cat['category'].'">'.$cat['category'].'</a>';
echo '<ul class="sub-menu">';
$linkq=$db->query("SELECT * FROM content WHERE category='" . $cat['category'] . "'");
foreach($linkq as $link){
echo '<li><a href="#">'.$link['menu_name'].'</a></li>';
}
echo '</ul></li>';
}
$q=$db->query(“按类别从内容顺序中选择不同的类别”);
foreach($q作为$cat){
echo'”;
回声';
echo';
$linkq=$db->query(“从内容中选择*,其中category='”。$cat['category'.'”);
foreach($linkq作为$link){
回音“”;
}
回音“
”;
}
我假设您想动态添加子菜单。如果是这样,那么首先为子菜单创建第二个表,并添加菜单和子菜单表之间的关系
$select=$connection->query("select * from menus");
while($result=$select->fetch_assoc()){
echo "<li>";
echo "<a href=\"#\">".$result['MenuTitle']."</a>";
$menuid=$result['MenuId'];
if($result==true){
$selectsubmenu=$connection->query("Select * from submenu where menuid='$menuid'");
echo "<ul>";
while($resultsubmenu=$selectsubmenu->fetch_assoc()){
echo "<li><a href=\"Services.php?submenu=".$resultsubmenu['SubMenuId']."\">".$resultsubmenu['SubMenuTitle']."
</a></li>";
}
echo "</ul>";
}
echo "</li>";
}
$select=$connection->query(“从菜单中选择*);
而($result=$select->fetch_assoc()){
回声“”;
回声“;
$menuid=$result['menuid'];
如果($result==true){
$selectsubmenu=$connection->query(“从menuid='$menuid'的子菜单中选择*);
回声“”;
而($resultsubmenu=$selectsubmenu->fetch_assoc()){
回声“”;
}
回声“
”;
}
回声“ ”;
}
我认为您应该粘贴内容表的屏幕截图(以了解您如何存储链接)我正在动态创建链接。。。喜欢index.php?link=$menu\url我知道,您可以从表中粘贴一些示例数据吗?当然可以:插入到content
(id
,菜单名
,菜单名
,菜单url
,标题名
,标题名
,文本
,类别
,日期
,可见
)值(26、‘测试名称’、‘测试url’、‘测试名称’、‘测试文本’、‘测试媒体’、‘2014-02-23’、‘测试文本’,