Подсчет уникальных значений по результатам подготовленного оператора MySQL в PHP

0

У меня есть онлайн-календарь с листингом живой музыки. Я использую подготовленное выражение для извлечения списков в течение следующих восьми дней и отображения их в таблице. Что мне нужно сделать, прежде чем отображать результаты, подсчитывается количество уникальных дат ("Дата") в списках. Например, если только пять дней из следующих восьми событий происходят, мне нужно знать, что число равно 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 всегда возвращало только один результат за дату, поэтому он не работал для отображения полных списков. Возможно, я собирался на это неправильно, но я оказался хорошим по-другому. Спасибо!

  • 0
    Привет всем, я прошу прощения за не отвечая. Это было мое первое сообщение о переполнении стека, и я забыл продолжать проверять первые несколько минут, потому что я идиот. В конце концов, я закончил делать отдельный запрос, который работал хорошо, так как я мог использовать его и для других вещей. Я обнаружил, что использование GROUP BY всегда возвращало только один результат на дату, поэтому он не работал для отображения полных списков. Может быть, я ошибался, но я оказался хорошим по-другому. Спасибо!
Теги:

3 ответа

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

Это требует повторения одних и тех же данных дважды, но для разумного объема данных для отображения на странице это не должно иметь большого значения.

  • 0
    Я пошел по другому пути (два запроса), который работал хорошо, потому что я мог использовать второй запрос и для других вещей. Однако этот ответ показывает мне, как сделать то, к чему я стремился, поэтому я ценю это и запомню это в следующий раз!
0

Использовать любой агрегированный метод, например count, sum для определенной группы. Вам необходимо применить GROUP BY для конкретного столбца или списка столбцов.

Пример:

 GROUP BY Date ORDER BY Date, Time, Host

Обратите внимание, что список столбцов в SELECT ДОЛЖЕН соответствовать списку столбцов, упомянутых вместе с GROUP BY.

Также,

Date >= ? AND Date <= ?

можно заменить на

Date BETWEEN ? AND ?
0

Вам не хватает группы:

GROUP BY Date

Ещё вопросы

Сообщество Overcoder
Наверх
Меню