我在一个名为 startdate 的表中有一个字段,我想做的是尽可能少地运行查询以获得一个显示如下的列表:
2012
January
March
October
2011
September
November
我想每年显示的唯一日期是有记录的日期。
任何帮助或指针表示赞赏。
谢谢
此查询可用于在给定日期(此处为开始日期)的表中查找所有不同的年/月组合。
SELECT YEAR(startdate) AS DYear, MONTH(startdate) AS DMonth
FROM tablename
GROUP BY YEAR(startdate), MONTH(startdate)
在以您选择的任何方式获得结果后,您可以执行以下操作:
$year = 0;
while ($row) { //loop through your rows here using while or foreach
if($year != $row['DYear']){
echo '<h1>'.$row['DYear'].'</h1>';
$year = $row['DYear'];
}
echo '<ul>';
echo '<li>'.$row['DMonth'].'</li>';
echo '</ul>';
}
正如其他帖子已经给出了您的答案,我将提供有关这些答案为何有效的信息。
在 SQL 选择语句中,您可以提供关键字。特别是对于 MySQL,您可以提供ALL, DISTINCT, DISTINCTROW
(以及其他与不同行无关的)。
后两个选项实际上是相同的选项并产生相同的结果。没有关键字的默认选择语句使用ALL
返回所有结果。通过传入,DISTINCT
您可以消除任何重复的条目。
重复条目是所有字段都相同的条目。但是,应该注意,如果您有一个自动递增的主键,则每一行都与最后一行不同,因为 pk 不同。为了使用这种设置选择不同的值,您需要指定一个真正不同的单独列名称。
有关 MySQL SELECT 语句的更多信息,请参阅用户指南的选择部分。
希望我没有提供您已经从提供的答案中收集到的信息,但我一直发现理解“为什么”和“如何”通常可以让我了解特定解决方案何时有效,以及何时无效.
SELECT DISTINCT YEAR(startdate), MONTHNAME(startdate)
FROM mytable
ORDER BY YEAR(startdate) desc, MONTH(startdate) asc;
应该可以解决问题,但是输出将是:
2012 January
2012 March
2012 October
2011 September
2011 November
您可以使用 eggyal 提供的代码将其转换为您正在寻找的格式。请注意,您需要在 MONTH 而不是 MONTHNAME 上订购(除非您想要按字母顺序)
使用PDO,您可以执行以下操作:
$dbh = new PDO("mysql:dbname=$dbname", $username, $password);
$qry = $dbh->query('
SELECT DISTINCT
YEAR(startdate) AS year,
MONTHNAME(startdate) AS month
FROM
my_table
ORDER BY
startdate
');
if ($qry) {
$row = $qry->fetch();
while ($row) {
$current_year = $row['year'];
echo '<h1>',htmlentities($current_year),'</h1><ul>';
do {
echo '<li>',htmlentities($row['month']),'</li>';
} while ($row = $qry->fetch() and $row['year'] == $current_year);
echo '</ul>';
}
}
select distinct column1, column2, column3... from table where columnx <> "" order by year, month