2011-12-01 123 views
0

我的数据库表创建归档是一样的东西:为我的博客网站

id year month 
1  2011 november 
2  2011 november 
3  2011 october 

我需要创建一个查询,以便它返回这样的事情:

2011 
    november 
    november 
    october 

什么是正确的查询语法在PHP脚本中做到这一点?

这里是我使用的代码:

<?php 

$uid = $_SESSION['uid']; 
$sql = "SELECT year, GROUP_CONCAT(month) AS months FROM articles GROUP BY year"; 
$res = mysql_query ($sql) or die (mysql_error()); 
if (mysql_num_rows($res) > 0) { 
    while ($rows = mysql_fetch_assoc($res)) { 
     foreach ($rows AS $row) { 
      echo $row['year'] . "<br>"; 
      $months = explode(",", $row['months']); 
      foreach ($months AS $m) { 
       echo $m . "<br>"; 
      } 
     } 
    } 
} 
?> 
+0

这只是关于演示,所以你不应该在查询中这么做。 – zerkms

+0

我的意思是,我需要2011年显示一次和月份列根据当年显示,每次我尝试,我2011年重复了3次。 – wfareed

+1

好吧,只是不输出第二和第三行的“2011”:-S – zerkms

回答

2

您可以使用GROUP_CONCAT()返回一个逗号分隔个月的列表:

SELECT year, GROUP_CONCAT(month) AS months GROM tbl GROUP BY year 

Returns: 
2011 november,november,october 

或者只是选择列和处理显示/演示在您的代码中:

SELECT year, month FROM tbl WHERE year = 2011 

Returns 
2011 november 
2011 november 
2011 october 

在代码中,循环并只显示当它ch安格斯。

更新由于代码示例似乎有必要...

// Results from above GROUP_CONCAT() query already fetched & stored in `$rowset`:  
while ($row = mysql_fetch_assoc($res)) { 
    $rowset[] = $row; 
} 

// Now $rowset is a 2D array containing all rows. 
foreach ($rowset as $row) { 
    // Output the year 
    echo $row['year'] . "\n"; 

    // months are comma-separated via GROUP_CONCAT() 
    // explode them into an array 
    $months = explode(",", $row['months']); 
    foreach ($months as $m) { 
    // Output the months 
    echo $m . "\n"; 
    } 
} 
+0

我建议避免使用'group_concat',因为它的长度限制为'group_concat_max_len',即使你可能赢了没有超过它,但对于'MySQL'中的新手来说可能有些棘手 – Nemoden

+0

我只需要显示一年并显示今年的所有月份! – wfareed

+0

@wfareed我明白这一点。它必须在PHP中完成,而不是在你的查询中完成。 –

0

如果我理解正确你的问题,我认为,一个简单的“ORDER BY”子句会做的伎俩对你来说,类似于:

SELECT * FROM table_name ORDER BY year DESC 

然后,使用脚本语言来显示数据,一个好主意,可能是(也许)来获取第一行的一年,它循环存储在一个时间变量,然后通过行和检查如果有的话,那一年会发生变化s,改变上述变量的值,如下所示:

$current_year = $data_set[0]['year']; 
foreach ($data_set as $data_row) 
{ 
    $current_year = ($data_row['year'] != $current_year) ? $data_row['year'] : $current_year; 
    //Do something with it and/or the rest of the data 
} 

希望这对您有所帮助。

干杯。