我有一个在线日历,列出即将上映的现场音乐。我使用预准备语句来获取接下来八天的列表并将其显示在表格中。在显示结果之前,我需要做的是计算列表中唯一日期的数量('日期')。例如,如果接下来的八天中只有五天发生了事件,我需要知道这个数字是5。
使用COUNT(DISTINCT)可以为我提供这个数字,但是它只显示一行结果,所以我需要另一个解决方案
我的代码是:
$mysqli = new mysqli("Login Stuff Here");
if ($mysqli->connect_errno){
echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;
}
$start = strtotime('today midnight');
$stop = strtotime('+1 week');
$start = date('Y-m-d', $start);
$stop = date('Y-m-d', $stop);
$allDates = $mysqli->prepare("SELECT
ID,
Host,
Type,
Bands,
Date,
Time,
Price,
Note,
Zip,
URL
FROM things WHERE (Date >= ? AND Date <= ?) ORDER BY Date, Time, Host");
$allDates->bind_param("ss", $start, $stop);
$allDates->execute();
$allDates->bind_result($ID, $Host, $Type, $Bands, $Date, $Time, $Price, $Note, $Zip, $URL);
while($allDates->fetch()):
// ECHO ALL THE INFO IN A NICE TABLE
endwhile;
$allDates->close();
我需要从&#39;日期&#39;中计算唯一值(甚至可能检索它们)。柱。现在我通过单独查询来完成它,但我确信这是一个更好的方法。
编辑:最后,我最后做了一个单独的查询,这个问题很好,因为我能够将它用于其他事情。我发现使用GROUP BY总是每个日期只返回一个结果,因此它不能用于显示完整列表。也许我错了,但我以另一种方式结束了。谢谢!
答案 0 :(得分:0)
您缺少分组:
SELECT
b.offer_id,
STRING_AGG(CONCAT(u.first_name,' ',u.last_name), ', ') AS full_name
FROM bids b
JOIN users u on b.user_id = u.id
GROUP BY b.offer_id
答案 1 :(得分:0)
使用任何聚合方法,例如count,特定组的总和。您需要在特定列或列列表中应用GROUP BY
。
示例:
GROUP BY Date ORDER BY Date, Time, Host
请注意,SELECT
必须中的列列表与GROUP BY
中提到的列列表相匹配。
此外,
Date >= ? AND Date <= ?
可以替换为
Date BETWEEN ? AND ?
答案 2 :(得分:0)
我建议您在从查询中获取结果时按日期分组。
while($row = $allDates->fetch()) {
$dates[$row['date'][] = $row;
}
这使得计算不同日期变得容易
$count = count($dates);
可能更简单的格式化输出(每个日期的标题/部分等)
foreach($dates as $date) {
foreach($date as $event) {
// ECHO ALL THE INFO IN A NICE TABLE
}
}
它确实需要迭代相同的数据两次,但是要在页面上显示合理数量的数据,这不会产生太大的影响。