Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Подсчет кол записей в запросе с подзапросом
 
 автор: mel_sasha   (04.06.2007 в 16:18)   письмо автору
 
 

есть 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 такая феничка как план запроса при отладке запроса?

   
 
 автор: Gust   (06.06.2007 в 14:30)   письмо автору
 
   для: 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

чтоб в запрос попали сведения о мененджерах

   
 
 автор: Trianon   (06.06.2007 в 15:04)   письмо автору
 
   для: Gust   (06.06.2007 в 14:30)
 

нельзя писать * и group by вместе.
То есть писать-то можно, но результат будет непредсказуем.

   
 
 автор: Gust   (06.06.2007 в 15:33)   письмо автору
 
   для: 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.Поле - будет лишним?

   
 
 автор: Trianon   (06.06.2007 в 15:40)   письмо автору
 
   для: 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ить с исходной для получения остальных полей по первичному ключу.

   
 
 автор: Gust   (06.06.2007 в 15:52)   письмо автору
 
   для: Trianon   (06.06.2007 в 15:40)
 

>будет вносить неоднозначность.
для однозначности можно поставить

SELECT firms.name_manager, first(manager_user.Поле) , count (firms.id)

   
 
 автор: Trianon   (06.06.2007 в 15:58)   письмо автору
 
   для: Gust   (06.06.2007 в 15:52)
 

Вы это пробовали?
Или может быть дадите ссылку на мануал, где такое описано?

   
 
 автор: Gust   (07.06.2007 в 10:20)   письмо автору
 
   для: Trianon   (06.06.2007 в 15:58)
 

да, пробывал, работает
вот даже засомневался, еще раз попробывал - работает без first() .
first()- не сработала (брал из access), а вот min()-сработала

   
 
 автор: Trianon   (07.06.2007 в 11:04)   письмо автору
 
   для: 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 - естественно что-то покажет, только логика запроса изменится.

   
 
 автор: Gust   (07.06.2007 в 11:21)   письмо автору
 
   для: Trianon   (07.06.2007 в 11:04)
 

где фигня?, я же написал
>first()- не сработала (брал из access), ...
я сам пишу вообще без всяких функций, и все работает:
конечно если предполагается, что значению поля, по которому идет группировка, соответсвует всегда одно и тоже значение дополнительное поле, например ID_USER и USER_NAME
А как я понял, это и предполагалось:
>нужно вывести одним запросом сколько фирм забил каждый менеджер в таблицу фирм

Неоднозначность, я так понимаю, возникла бы при наличии разных значений в доп. поле для одного и того же значения поля группировки: для этого и предлагалось использовать min() для отбора 1 (наменьшего) значения.

   
 
 автор: Trianon   (07.06.2007 в 11:56)   письмо автору
 
   для: Gust   (07.06.2007 в 11:21)
 

Неоднозначность существует в запросе независимо от того, чем именно наполнены таблицы.
Вот попробуете написать что-либо такое в MSSQL или в ORACLE - Вас очень быстро обломают.

Конечно, сами Вы можете писать и применять что угодно и как угодно.
Советовать же стоит методы, которые не противоречат SQL как таковому.

Где фигня?
Вот фигня:
>>>для однозначности можно поставить
>>>SELECT firms.name_manager, first(manager_user.Поле) , count (firms.id)
>>Вы это пробовали?
>да, пробывал, работает
не пробовали. Пробовали два совсем других запроса.

   
 
 автор: Gust   (07.06.2007 в 12:51)   письмо автору
 
   для: 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 работает.

   
 
 автор: Trianon   (07.06.2007 в 12:59)   письмо автору
 
   для: Gust   (07.06.2007 в 12:51)
 

уффф....

Применение функции min() решает проблему неоднозначности. Поскольку
если в списке SELECT запроса с группировкой, помимо самих полей группировки,
другие поля присутствуют только в агрегатных функциях - то запрос становится однозначным.
Запрашиваются ключи групп и результаты агрегатных функций, вычисленные по содержимому групп.
min() - агрегатная функция.
Если идет прямой запрос поля, не входящего в список группировки, то сервер вынужден брать значение поля из какой-нибудь записи группы.
Сама по себе такая постановка вопроса при детерминированном подходе к исполнению запросов является неуместной.
В нормальных СУБД такой запрос считается ошибочным.
В MSACCESS, видимо, решили эту неуместность разрешить функцией first() Неоднозначность при этом остается - иди гадай, какая строка первой попадется движку.
В MySQL - оставили, вероятно, то для упрощения то ли кода, то ли - самих запросов.
И теперь эта слабина провоцирует написание тонн скриптов, в которых программист оставляет неоднозначность.
А потом в таких скриптах находятся ошибки.
А потом про них задают вопросы в форумах.
А потом на них приходится отвечать.
И убеждать людей, что если запрос неоднозначен - то его нельзя считать правильным. Несмотря на то, что сервер не ругается.
Поскольку четкие намерения автора кода - неясны.
А значит - сервер может выдать любую лажу.
Как в такой ситуации исправлять чужой скрипт?

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования