从PHP中准备好的MySQL语句的结果中计算唯一值

时间:2018-01-23 18:17:18

标签: php mysql

我有一个在线日历,列出即将上映的现场音乐。我使用预准备语句来获取接下来八天的列表并将其显示在表格中。在显示结果之前,我需要做的是计算列表中唯一日期的数量('日期')。例如,如果接下来的八天中只有五天发生了事件,我需要知道这个数字是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总是每个日期只返回一个结果,因此它不能用于显示完整列表。也许我错了,但我以另一种方式结束了。谢谢!

3 个答案:

答案 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
    }
}

它确实需要迭代相同的数据两次,但是要在页面上显示合理数量的数据,这不会产生太大的影响。