У меня есть онлайн-календарь с листингом живой музыки. Я использую подготовленное выражение для извлечения списков в течение следующих восьми дней и отображения их в таблице. Что мне нужно сделать, прежде чем отображать результаты, подсчитывается количество уникальных дат ("Дата") в списках. Например, если только пять дней из следующих восьми событий происходят, мне нужно знать, что число равно 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();
Мне нужно подсчитать уникальные значения (и, возможно, даже получить их) из столбца "Дата". Сейчас я работаю, выполняя отдельный запрос, но я уверен, что есть лучший способ.
EDIT: В конечном счете, я закончил выполнение отдельного запроса, который хорошо сработал, поскольку я смог использовать его и для других вещей. Я обнаружил, что использование GROUP BY всегда возвращало только один результат за дату, поэтому он не работал для отображения полных списков. Возможно, я собирался на это неправильно, но я оказался хорошим по-другому. Спасибо!
Я бы рекомендовал группировать по дате, когда вы извлекаете результаты из запроса.
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
}
}
Это требует повторения одних и тех же данных дважды, но для разумного объема данных для отображения на странице это не должно иметь большого значения.
Использовать любой агрегированный метод, например count, sum для определенной группы. Вам необходимо применить GROUP BY
для конкретного столбца или списка столбцов.
Пример:
GROUP BY Date ORDER BY Date, Time, Host
Обратите внимание, что список столбцов в SELECT
ДОЛЖЕН соответствовать списку столбцов, упомянутых вместе с GROUP BY
.
Также,
Date >= ? AND Date <= ?
можно заменить на
Date BETWEEN ? AND ?
Вам не хватает группы:
GROUP BY Date