Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将mysql结果按类别分组,并将其显示为每个类别下的组_Php_Mysql - Fatal编程技术网

Php 将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"

我试图创建一个简单的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</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或PDO

SQL
groupby
语句对结果进行分组,以便每个类别只返回一行。这通常与诸如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’、‘测试文本

    ’,