В группе ПО отображаются не все поля

#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: Теперь вам действительно следует опубликовать разумный набор примеров строк. Без этого мы все просто гадаем (как вы, возможно, уже заметили).