|
|
|
| есть 2 баблицы firms и manager_user,
связаны между собой значением firms.name_manager
<->manager_user.login
нужно вывести одним запросом сколько фирм забил каждый менеджер в таблицу фирм
пробовал (в СИБЕЙСЕ пашит!)
SELECT *
FROM manager_user, (
SELECT count( id ) AS kol
FROM firms
WHERE firms.name_manager = manager_user.login
)
Bыдает ошибку
Ответ MySQL:
#1248 - Every derived table must have its own alias
Кто подскажит как решить этот вопрос?
А еще , кто знает есть в ли в MySQL такая феничка как план запроса при отладке запроса? | |
|
|
|
|
|
|
|
для: mel_sasha
(04.06.2007 в 16:18)
| | наверно так:
SELECT *, count (id)
FROM firms
GROUP BY name_manager
|
или
SELECT *, count (id)
FROM firms left join manager_user on firms.name_manager=manager_user.login
GROUP BY name_manager
|
чтоб в запрос попали сведения о мененджерах | |
|
|
|
|
|
|
|
для: Gust
(06.06.2007 в 14:30)
| | нельзя писать * и group by вместе.
То есть писать-то можно, но результат будет непредсказуем. | |
|
|
|
|
|
|
|
для: Gust
(06.06.2007 в 14:30)
| | a так?
SELECT firms.name_manager, manager_user.Поле , count (firms.id)
FROM firms left join manager_user on firms.name_manager=manager_user.login
GROUP BY name_manager
|
или manager_user.Поле - будет лишним? | |
|
|
|
|
|
|
|
для: Gust
(06.06.2007 в 15:33)
| | будет вносить неоднозначность.
Если поле "Поле" однозначно определяется полем name_manager, в принципе можно написать
SELECT firms.name_manager, manager_user.Поле , count (firms.id)
... GROUP BY firms.name_manager, manager_user.Поле
|
Хотя честнее всё же получить таблицу соответствия первичного ключа значению агрегатной функции , и уже эту таблицу JOINить с исходной для получения остальных полей по первичному ключу. | |
|
|
|
|
|
|
|
для: Trianon
(06.06.2007 в 15:40)
| | >будет вносить неоднозначность.
для однозначности можно поставить
SELECT firms.name_manager, first(manager_user.Поле) , count (firms.id)
|
| |
|
|
|
|
|
|
|
для: Gust
(06.06.2007 в 15:52)
| | Вы это пробовали?
Или может быть дадите ссылку на мануал, где такое описано? | |
|
|
|
|
|
|
|
для: Trianon
(06.06.2007 в 15:58)
| | да, пробывал, работает
вот даже засомневался, еще раз попробывал - работает без first() .
first()- не сработала (брал из access), а вот min()-сработала | |
|
|
|
|
|
|
|
для: Gust
(07.06.2007 в 10:20)
| | Фигню пороть не надо.
SELECT firms.name_manager, first(manager_user.Поле) , count (firms.id)
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '(manager_user.Поле) ...
Нет функции first() в SQL.
min - естественно что-то покажет, только логика запроса изменится. | |
|
|
|
|
|
|
|
для: Trianon
(07.06.2007 в 11:04)
| | где фигня?, я же написал
>first()- не сработала (брал из access), ...
я сам пишу вообще без всяких функций, и все работает:
конечно если предполагается, что значению поля, по которому идет группировка, соответсвует всегда одно и тоже значение дополнительное поле, например ID_USER и USER_NAME
А как я понял, это и предполагалось:
>нужно вывести одним запросом сколько фирм забил каждый менеджер в таблицу фирм
Неоднозначность, я так понимаю, возникла бы при наличии разных значений в доп. поле для одного и того же значения поля группировки: для этого и предлагалось использовать min() для отбора 1 (наменьшего) значения. | |
|
|
|
|
|
|
|
для: Gust
(07.06.2007 в 11:21)
| | Неоднозначность существует в запросе независимо от того, чем именно наполнены таблицы.
Вот попробуете написать что-либо такое в MSSQL или в ORACLE - Вас очень быстро обломают.
Конечно, сами Вы можете писать и применять что угодно и как угодно.
Советовать же стоит методы, которые не противоречат SQL как таковому.
Где фигня?
Вот фигня:
>>>для однозначности можно поставить
>>>SELECT firms.name_manager, first(manager_user.Поле) , count (firms.id)
>>Вы это пробовали?
>да, пробывал, работает
не пробовали. Пробовали два совсем других запроса. | |
|
|
|
|
|
|
|
для: Trianon
(07.06.2007 в 11:56)
| | >Неоднозначность существует в запросе независимо от того, чем именно наполнены таблицы.
Согласен. Установка функции min() решает проблему неоднозначности в запросе?
>Вот попробуете написать что-либо такое в MSSQL или в ORACLE - Вас очень быстро обломают.
Не пробывал, но верю. Однако от mel_sasha:
>Ответ MySQL: #1248 - Every...
(или я форумом ошибся :)
>Советовать же стоит методы, которые не противоречат SQL как таковому.
Почему? Често, не пойму, может объясните?
Или нет никакой специфики между базами? и все Абсолютно подчиняются >SQL как таковому
А как же (от mel_sasha):
>пробовал (в СИБЕЙСЕ пашит!).....
>Bыдает ошибку Ответ MySQL:....
>Вот фигня: ....>>>SELECT firms.name_manager, first(manager_user.Поле) , count (firms.id)
Функция first() существует в MsAccess, и вспомнил я о ней после вашего поста о неоднозначности, в mysql - никогда не применял, а только попробывал для проверки и убедился, что не работает (о чем сразу же и написал).
Я больше практик и могу не знать всех тонкостей >SQL как такового. (потому и на форуме)
>не пробовали. Пробовали два совсем других запроса.
разумеется другие, но не "совсем", а только с другими перемеными (для моей базы)
вот мой запрос:
SELECT estimation.private_affair, count( estimation.id ) , private_affair.name
FROM estimation
LEFT JOIN private_affair ON estimation.private_affair = private_affair.id
GROUP BY estimation.private_affair
|
Полагаю, что гдето он не сработает (т.к. не соответствует >SQL как таковому), но в mysql работает. | |
|
|
|
|
|
|
|
для: Gust
(07.06.2007 в 12:51)
| | уффф....
Применение функции min() решает проблему неоднозначности. Поскольку
если в списке SELECT запроса с группировкой, помимо самих полей группировки,
другие поля присутствуют только в агрегатных функциях - то запрос становится однозначным.
Запрашиваются ключи групп и результаты агрегатных функций, вычисленные по содержимому групп.
min() - агрегатная функция.
Если идет прямой запрос поля, не входящего в список группировки, то сервер вынужден брать значение поля из какой-нибудь записи группы.
Сама по себе такая постановка вопроса при детерминированном подходе к исполнению запросов является неуместной.
В нормальных СУБД такой запрос считается ошибочным.
В MSACCESS, видимо, решили эту неуместность разрешить функцией first() Неоднозначность при этом остается - иди гадай, какая строка первой попадется движку.
В MySQL - оставили, вероятно, то для упрощения то ли кода, то ли - самих запросов.
И теперь эта слабина провоцирует написание тонн скриптов, в которых программист оставляет неоднозначность.
А потом в таких скриптах находятся ошибки.
А потом про них задают вопросы в форумах.
А потом на них приходится отвечать.
И убеждать людей, что если запрос неоднозначен - то его нельзя считать правильным. Несмотря на то, что сервер не ругается.
Поскольку четкие намерения автора кода - неясны.
А значит - сервер может выдать любую лажу.
Как в такой ситуации исправлять чужой скрипт? | |
|
|
|