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>';
}
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
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
egyal が提供するコードを使用して、これを探している形式に変換できます。MONTHNAME ではなく MONTH で注文する必要があることに注意してください (アルファベット順を希望する場合を除く)。
他の投稿で回答が得られたので、これらの回答が機能する理由に関する情報を提供します。
SQL 選択ステートメントでは、キーワードを指定できます。特にMySQLの場合、提供できますALL, DISTINCT, DISTINCTROW
(および個別の行に関係のないその他のもの)。
後者の 2 つのオプションは、実際には同じオプションであり、同じ結果が得られます。ALL
すべての結果を返すキーワードを使用しないデフォルトの select ステートメント。渡すことでDISTINCT
、重複するエントリを排除します。
重複エントリは、すべてのフィールドが同じエントリですが、自動インクリメント主キーがある場合、pk が異なるため、各行は最後の行とは異なることに注意してください。この種のセットアップで個別の値を選択するには、真に個別の列名を指定する必要があります。
MySQL SELECT ステートメントの詳細については、ユーザー ガイドの select セクションを参照してください。
提供された回答から既に収集した情報を提供していないことを願っていますが、「なぜ」と「どのように」を理解することで、特定のソリューションがいつ機能するか、機能しないかを理解できることがよくあります.