#mysql #group-by
Вопрос:
НОВОЕ ОБНОВЛЕНИЕ: сначала я сортирую по другому полю под названием «избранное»
$result
Единственное поле $query
показывает поле $row['symbol']
, оно не показывает поле $row['id']
. Что я делаю не так?
CREATE TABLE `tableName` ( `id` varchar(15) DEFAULT NULL, `symbol` varchar(10) DEFAULT NULL, `fav` varchar(15) DEFAULT NULL
)
$query = "SELECT symbol FROM (SELECT * FROM tableName ORDER BY fav DESC ) AS t GROUP BY t.symbol "; $result = mysqli_query($conn, $query); if($result-gt;num_rows gt; 0){ while($row = mysqli_fetch_assoc($result)){ echo 'id: '.$row['id'].' symbol: '.$row['symbol'].'lt;BRgt;'; } }
Я использую PHP 7.4.16
ОБНОВЛЕНИЕ: С PHP 8.0.3 я получаю это СООБЩЕНИЕ ОБ ОШИБКЕ:
Предупреждение: Неопределенный ключ массива «id»
Это похоже на то, что он не находит идентификатор, однако, если я запустил его так, он работает нормально:
$query = "SELECT * FROM tableName ORDER BY symbol DESC";
Комментарии:
1. Только ты
SELECT symbol
, ты не знаешьSELECT id, symbol
илиSELECT *
.2. Вы можете выбрать только столбцы, по которым вы сгруппированы. Нет никакой логики, по которой вы выбираете уникальный идентификатор для сгруппированных строк. И ваша проблема заключается исключительно в SQL
3. Предположим, у вас есть три строки с одним и тем же символом, с идентификаторами 1, 2 и 3, какие из этих 3 идентификаторов вы ожидаете вернуть и почему?
4. Возможно, опубликуйте хороший образец строк с именами таблиц, а затем также то, что должен возвращать запрос.
5. Поэтому, если вам нужны все идентификаторы, то вам вообще не нужно группироваться , вам нужно сделать
ORDER BY Symbol
следующее: затем на уровне приложения обработайте его, например, проверяйте символ с каждой итерацией, и когда он изменится, начните новую строку, или как бы вы ни хотели выводить данные. В качестве альтернативы, используйтеGROUP_CONCAT
вместе сGROUP BY
, чтобы объединить все идентификаторы в один столбец. Это действительно зависит от того, что вам нужно, от того, какое решение является лучшим.
Ответ №1:
Я не понимаю вопроса. Мое лучшее предположение, что ГРУППИРОВКА ПО не нужна:
SELECT symbol, fav, id FROM tableName ORDER BY symbol DESC, fav DESC, id
Другой возможностью было бы собрать все идентификаторы для каждого символа:
SELECT symbol, GROUP_CONCAT(id SEPARATOR ', ') FROM tableName GROUP BY symbol DESC
Отредактируйте, чтобы включить столбец fav:
SELECT symbol, fav, GROUP_CONCAT(id SEPARATOR ', ') AS ids FROM tableName GROUP BY symbol DESC, fav DESC ORDER BY symbol DESC, fav DESC
Комментарии:
1. Второй вариант работает, но когда я добавляю «ЗАКАЗ ПО запросу», он не работает.
2. Это потому, что это не является частью запроса. Я отредактирую его.
3. Спасибо, этот более поздний со столбцом «избранное» работает, но по-прежнему не показывает строку $[«идентификатор»]. Итак, я предполагаю, что это проблема с моим сервером MAMP, который я уже переустановил.
4. В третьих столбцах должны отображаться идентификаторы , объединенные запятыми для каждого символа и комбинации символов. Если вы хотите, чтобы каждый идентификатор был в строке on в наборе результатов, используйте мой первый пример (в котором не используется GROUP BY).
Ответ №2:
Трудно определить ваши намерения по вашему SQL-запросу. Ваш запрос таков.
SELECT symbol FROM ( SELECT * FROM tableName ORDER BY symbol DESC ) AS t GROUP BY t.symbol
Это означает то же самое, что и это. (Я опустил ORDER BY, потому что операции ORDER BY в подзапросах не гарантируют, что они будут перенесены во внешние запросы.)
SELECT DISTINCT symbol FROM tableName
Ни один из этих запросов не возвращает id
столбец. Вот почему ваша ссылка на php $row['id']
не работает.
Возможно ли, что вы хотите ORDER BY
этого, а не GROUP BY
этого ? В этом случае ваш запрос будет
SELECT * FROM tableName ORDER BY symbol DESC
Или, возможно, у вас в таблице есть повторяющиеся symbol
значения, и вы хотите id
получить только одну из повторяющихся строк? В таком случае вам нужно что-то подобное.
SELECT MAX(id) id, symbol FROM tableName GROUP BY symbol ORDER BY symbol DESC
Запрос находит наибольшее значение идентификатора для каждого отдельного значения символа и возвращает его.
Комментарии:
1. функция SELECT DISTINCT работает идеально. Но потом, когда я добавляю ЗАКАЗ, он не работает. ЗАКАЖИТЕ ПО ЗАПРОСУ [ см. НОВОЕ ОБНОВЛЕНИЕ, пожалуйста ].
2. @sebseb: Теперь вам действительно следует опубликовать разумный набор примеров строк. Без этого мы все просто гадаем (как вы, возможно, уже заметили).