|
|
|
|
|
для: cheops
(21.09.2009 в 01:25)
| | >Если не сложно гляньте вложение
глянул. Удивился.
>и сообщите версию вашего MySQL-сервера (у меня 5.1.37).
5.0.45
>Слишком сильное и неоднозначное утверждение,
Да, наверное. Никогда нельзя делать однозначных утверждений, рассматривая поведение серверов на неоднозначных запросах. :)
>его можно читать так, что вы отрицаете наличие группы, совпадающей с таблицей в запросах вида
SELECT COUNT(id) FROM tbl;
А вот это - дудки.
Я протестую лишь против чего-то вроде
SELECT title, COUNT(id) FROM tbl;
и
SELECT title, version, COUNT(id) FROM tbl GROUP BY title;
Да и то, вобщем-то, лишь в том случае, если title не определяет version однозначно (т.е. когда все висящие поля (вроде version в этом примере) не меняют своих значений на всем диапазоне строк группы.)
В запросе SELECT COUNT(id) FROM tbl; нет ни одной ссылки на таблицу не из агрегатной функции, которая не была бы перечислена в GROUP BY, просто потому, что "нет ни одной ссылки на таблицу не из агрегатной функции" вообще.
PS. Естественно, в первом примере дописать GROUP BY я просто забыл...
само собой разумеющиеся вещи иногда выскакивают из головы.
PS2. Если рассмотреть пример из Вышего скриншота, он лишь подтверждает мысль.
Почему именно "Вычислительные машины и труднорешаемые задачи", а не какая-то другая книга?
Я даже не могу сказать, что потому, что первой попалась серверу.
Может не первой, а наоборот - последней. | |
|
|
|
|
 15 Кб |
|
|
для: Trianon
(21.09.2009 в 01:10)
| | Если не сложно гляньте вложение и сообщите версию вашего MySQL-сервера (у меня 5.1.37).
>Утверждение ложное.
Слишком сильное и неоднозначное утверждение, его можно читать так, что вы отрицаете наличие группы, совпадающей с таблицей в запросах вида
SELECT COUNT(id) FROM tbl;
|
Т.е. такие запросы должны вызывать ошибку, что разумеется не так. Если GROUP BY нет - группой считается вся таблица. | |
|
|
|
|
|
|
|
для: cheops
(20.09.2009 в 23:51)
| | >Если GROUP BY не используется, считается, что группа одна - все возвращаемые записи - поэтому выводится только одна книга и все авторы, которые только нашлись.
Утверждение ложное.
Ответом на этот запрос будет вот такая диагностика.
#1140 - Mixing of GROUP columns (MIN(),MAX(),COUNT(),...) with no GROUP columns is illegal if there is no GROUP BY clause
Даже MySQL-серверу нужен хотя бы один группирующий параметр.
Он (если не включен режим ONLY_FULL_GROUP_BY) плюнет на оставшиеся (кроме перечисленных в GROUP BY) , выраждения в SELECT . Но для этого нужно хоть что-то перечислить.
Если ONLY_FULL_GROUP_BY включен - любой GROUP-неоднозначный запрос будет отклонен.
Само собой, это не специфика GROUP_CONCAT, другие агрегатные функции (MAX, AVG, COUNT и пр.) ведут себя аналогично. | |
|
|
|
|
|
|
|
для: illuzion
(20.09.2009 в 23:31)
| | Дело в том, что функция GROUP_CONCAT() реагирует на группы, когда вы используете группировку GROUP BY books.title - конструкция создает количество групп соответствующее количеству уникальных значений books.title. Если GROUP BY не используется, считается, что группа одна - все возвращаемые записи - поэтому выводится только одна книга и все авторы, которые только нашлись. | |
|
|
|
|
|
|
|
для: illuzion
(20.09.2009 в 23:31)
| | Функция GROUP_CONCAT() - агрегатная. То есть при корректно построенном запросе она обрабатывает все строки, попадающие в выборку (если GROUP BY не указан) или в каждую из групп (если GROUP BY указан) . Но в первом случае в выражении SELECT вообще не должны участовать ссылки на выборку кроме как внутри агрегатных функций. Поскольку запрашивался books.title вне агрегата и без GROUP BY по нему - запрос был отклонен. | |
|
|
|
|
|
|
|
для: cheops
(20.09.2009 в 23:19)
| | Спасибо! Получилось!
А почему так? Как одна группировка могла повлиять на выполнение запроса? | |
|
|
|
|
|
|
|
для: illuzion
(20.09.2009 в 22:39)
| | Добавьте группировку по полю books.title
SELECT books.title, GROUP_CONCAT(persons.name ORDER BY persons.name SEPARATOR ', ' ) AS author_names
FROM books LEFT JOIN
authors ON books.id=authors.idbook LEFT JOIN
persons ON authors.idperson=persons.id
GROUP BY books.title
|
| |
|
|
|
|
 2.5 Кб |
|
|
для: cheops
(20.09.2009 в 22:31)
| | Спасибо за подсказку. Сделано. | |
|
|
|
|
|
|
|
для: illuzion
(20.09.2009 в 21:30)
| | Вам доступен phpMyAdmin? Если да, то всех проще его сделать в меню "Експорт", если phpMyAdmin не доступен, то можно воспользоваться утилитой mysqldump
mysqldump -u root base > base.sql
|
root - имя пользователя
base - название базы данных
base.sql - имя файла, куда сохраняется дамп | |
|
|
|
|
|
|
|
для: cheops
(20.09.2009 в 20:44)
| | А как сделать дамп? | |
|
|
|
|