powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите с запросом
25 сообщений из 25, страница 1 из 1
помогите с запросом
    #35065442
imladris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SELECT maker as m, (select 
case when COUNT(DISTINCT pc.model)= 0  
then 'no' else COUNT(DISTINCT pc.model)  end
   FROM product pr 
   JOIN pc ON pr.model=pc.model 
  WHERE maker = m ) pc,

(select case when COUNT(DISTINCT laptop.model)= 0 
 then 'no' else COUNT(DISTINCT laptop.model)  end
   FROM product pr 
   JOIN laptop ON pr.model=laptop.model 
  WHERE maker = m ) laptop,

(select case when COUNT(DISTINCT printer.model)= 0  
then 'no' else COUNT(DISTINCT printer.model) end
   FROM product pr 
   JOIN printer ON pr.model=printer.model 
  WHERE maker = m ) printer

from product
group by maker 

на локальном компьютере этот запрос работает, а на другом почему то ругаеться, Invalid column name 'm'.
Помогите, плз!
...
Рейтинг: 0 / 0
помогите с запросом
    #35065498
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
версии MySQL в обоих случаях?
...
Рейтинг: 0 / 0
помогите с запросом
    #35065793
imladris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я нее знаю... вообще-то это тестовое задание с www.sql-ex.ru. А я не знаю какая там версия
...
Рейтинг: 0 / 0
помогите с запросом
    #35065802
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда аккуратно перепишите запрос с алиасами таблиц и с явным указанием таблиц (или их алиасов) для каждого из упоминаемых полей.
...
Рейтинг: 0 / 0
помогите с запросом
    #35065813
imladris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то я не понимаю... Где аккуратно прописать? Там вроде все аккуратно
...
Рейтинг: 0 / 0
помогите с запросом
    #35065837
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SELECT t.maker as m, (select 
case when COUNT(DISTINCT pc.model)= 0  
then 'no' else COUNT(DISTINCT pc.model)  end
   FROM product pr 
   JOIN pc ON pr.model=pc.model 
  WHERE pr.maker = t.maker ) pc,

(select case when COUNT(DISTINCT laptop.model)= 0 
 then 'no' else COUNT(DISTINCT laptop.model)  end
   FROM product pr 
   JOIN laptop ON pr.model=laptop.model 
  WHERE pr.maker = t.maker  ) laptop,

(select case when COUNT(DISTINCT printer.model)= 0  
then 'no' else COUNT(DISTINCT printer.model) end
   FROM product pr 
   JOIN printer ON pr.model=printer.model 
  WHERE pr.maker = t.maker  ) printer

from product t
group by t.maker 
Примерно так.
Вообще в сложных запросах, имхо, поля без явного указания таблицы лучше не использовать, т.к. слишком легко налететь на ошибку.
...
Рейтинг: 0 / 0
помогите с запросом
    #35065846
imladris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прописала, не помогло...
А может есть какой-нить другой вариант доступа к определенной строке?
...
Рейтинг: 0 / 0
помогите с запросом
    #35065853
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
imladrisПрописала, не помогло...Как именно не помогло?
imladrisА может есть какой-нить другой вариант доступа к определенной строке?Что-то ваш запрос не похож на "вариант доступа к определенной строке". Или это уже отдельный вопрос?
...
Рейтинг: 0 / 0
помогите с запросом
    #35065855
imladris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ой, извините.... сейчас уже работает.. спасибо!
...
Рейтинг: 0 / 0
помогите с запросом
    #35066051
imladris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уважаемый, miksoft. А не моргли бы Вы мне подсказать как еще можно более оптимизировать запрос, а то на сайте выдаеться сообщение: Ваш запрос вернул правильные данные на основной базе, но не прошел тест на проверочной базе.
...
Рейтинг: 0 / 0
помогите с запросом
    #35066220
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
SELECT product.maker as m,
CASE WHEN COUNT(DISTINCT pc.model)= 0  THEN 'no' ELSE COUNT(DISTINCT pc.model) END pc,
CASE WHEN COUNT(DISTINCT laptop.model)= 0  THEN 'no' ELSE COUNT(DISTINCT laptop.model)  END laptop,
CASE WHEN COUNT(DISTINCT printer.model)= 0  THEN 'no' ELSE COUNT(DISTINCT printer.model) END printer,
FROM product
LEFT JOIN pc ON product.model=pc.model
LEFT JOIN laptop ON product.model=laptop.model
LEFT JOIN printer ON product.model=printer.model
GROUP BY product.maker
Вроде так, если не наврал...
...
Рейтинг: 0 / 0
помогите с запросом
    #35066406
imladris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо огромное!!! :)
Но опять не работает
...
Рейтинг: 0 / 0
помогите с запросом
    #35066414
imladris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Т.е. неправильный результат на проверочной БД.
...
Рейтинг: 0 / 0
помогите с запросом
    #35066425
imladris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какой-то загадочный скрипт!!
...
Рейтинг: 0 / 0
помогите с запросом
    #35066456
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тогда давайте исходное задание сюда.
Хотя публичное решение задач с www.sql-ex.ru на нашем сайте не приветствуется.
...
Рейтинг: 0 / 0
помогите с запросом
    #35066465
imladris
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Но оно очень странное... если бы не такое тупое задание, я бы не обращалась...
Вобщем так:
Отношение Product представляет производителя (maker), номер модели (model) и тип (PC - ПК, Laptop - ПК-блокнот или Printer - принтер). Предполагается, что номера моделей уникальны для всех производителей и типов продуктов. В отношении PC для каждого номера модели, обозначающего ПК, указаны скорость -speed (процессора в мегагерцах), общий объем RAM (в мегабайтах), размер диска -hd (в гигабайтах), скорость считывающего устройства CD (например, 4х) и цена - price. Отношение Laptop аналогично отношению РС за исключением того, что вместо скорости CD содержится размер экрана -screen (в дюймах). В отношении Printer для каждой модели принтера указывается, является ли он цветным - color ('y', если цветной), тип принтера - type (лазерный - Laser, струйный - Jet или матричный - Matrix) и цена.


Для таблицы Product получить результирующий набор в виде таблицы со столбцами maker, pc, laptop и printer, в которой для каждого производителя требуется указать, производит он (yes) или нет (no) соответствующий тип продукции.
В первом случае (yes) указать в скобках без пробела количество имеющихся в наличии (т.е. находящихся в таблицах PC, Laptop и Printer) различных по номерам моделей соответствующего типа.
...
Рейтинг: 0 / 0
помогите с запросом
    #35106151
GlooBus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
imladrisНо оно очень странное... если бы не такое тупое задание, я бы не обращалась...

Присоединяюсь, самому интересно как же это решается на уровне мускула, т.к. используя свой оракл я данное задание решил без проблем
...
Рейтинг: 0 / 0
помогите с запросом
    #35139620
MartKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Аналогично - засел на этой задачке, на сайте подсказка к ней ничего не дает. всю голову сломал - не пойму что не так. Хоть какую-нибудь наводку
...
Рейтинг: 0 / 0
помогите с запросом
    #35185076
winter2007
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
верно будет так:,только с 'yes' нужно еще подумать

select product.maker,
case when count(distinct pc.model) = 0 then 'no' else cast( count(distinct pc.model) as char(20)) end,

case when count(distinct laptop.model) = 0 then 'no' else cast( count(distinct laptop.model) as char(20)) end ,

case when count(distinct printer.model) = 0 then 'no' else cast( count(distinct printer.model) as char(20)) end


from product
left join pc on product.model = pc.model
left join laptop on product.model = laptop.model
left join printer on product.model = printer.model
group by product.maker
...
Рейтинг: 0 / 0
помогите с запросом
    #35251445
dante77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
помогаю
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select t.maker,
case when pc =  0  and t.maker not in (select maker from product where type = 'pc') then 'no' else 'yes('+pc+')' end pc, 
case when laptop =  0  and t.maker not in (select maker from product where type = 'laptop') then 'no' else 'yes('+laptop+')' end laptop, 
case when printer =  0  and t.maker not in (select maker from product where type = 'printer') then 'no' else 'yes('+printer+')' end printer
from (
select maker, cast(count(distinct q.model) as varchar(max)) pc
from product p left join pc q on p.model = q.model
group by maker) t
join (
select maker, cast(count(distinct q.model) as varchar(max)) laptop
from product p left join laptop q on p.model = q.model
group by maker) tt on t.maker = tt.maker
join (
select maker, cast(count(distinct q.model) as varchar(max)) printer
from product p left join printer q on p.model = q.model
group by maker) ttt
on t.maker = ttt.maker
...
Рейтинг: 0 / 0
помогите с запросом
    #35251447
dante77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GlooBus imladrisНо оно очень странное... если бы не такое тупое задание, я бы не обращалась...

Присоединяюсь, самому интересно как же это решается на уровне мускула, т.к. используя свой оракл я данное задание решил без проблем
в данном конкретном случае выбор СУБД ИМХО никак не влияет на результат
...
Рейтинг: 0 / 0
помогите с запросом
    #35741119
genixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я канеш все понимаю, что решать нужно самому и т.п., но очень неудобно понять в чем ошибка, когда запрос выполняется на втором тесте и даже неясно как решать проблему. Понятно, что так было сделано для защиты от подстановки значений, но вот я сейчас вообще не знаю что именно изменить чтоб заработало.
Посмотрите, пожалуйста, кто решил задачу - в чем проблема? Почему он не проходит на другом тесте, ведь вроде все должно быть нормально...

Код: plaintext
1.
2.
3.
4.
5.
6.
SELECT DISTINCT 
   maker,
   REPLACE('yes('+CAST ((SELECT COUNT(DISTINCT b.model) FROM pc b, product c WHERE b.model=c.model AND c.type='pc' AND c.maker=a.maker) AS VARCHAR) + ')', 'yes(0)','no'),
   REPLACE('yes('+CAST ((SELECT COUNT(DISTINCT b.model) FROM laptop b, product c WHERE b.model=c.model AND c.type='laptop' AND c.maker=a.maker) AS VARCHAR) + ')', 'yes(0)','no'),
   REPLACE('yes('+CAST ((SELECT COUNT(DISTINCT b.model) FROM printer b, product c WHERE b.model=c.model AND c.type='printer' AND c.maker=a.maker) AS VARCHAR) + ')', 'yes(0)','no')

FROM product a
...
Рейтинг: 0 / 0
помогите с запросом
    #35742165
genixxx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ладно, не парьтесь, уже нашел в чем проблема. Надо выводить yes не только для тех, товары которых есть в наличии, но и для которых они существуют, но на данный момент нет в наличии. Поэтому мой способ с реплейсом без кейса не прокатит.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
помогите с запросом
    #39976783
Metaphor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
genixxx,

B твоем запросе ошибка, ввиду того, что по условию задачи yes(0) не равен no, поэтому более правильно добавить проверку через case:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
select distinct a.maker
      ,case when a.maker in (select Pr.maker from Product as Pr Left join PC PC_a on Pr.model = PC_a.model where Pr.type = 'PC')                                  -- Проверяется условие по нахождению PC производителя - maker в  таблице Product 
            then 'yes(' + CAST ((SELECT COUNT(DISTINCT b.model) FROM pc b, product c WHERE b.model=c.model AND c.type='pc' AND c.maker=a.maker) AS VARCHAR) + ')' -- В случае положительного ответа в строке выше, выводится значение количества уникальных строк
            else 'no' END as PC                                                                                                                                   -- В случае отрицательного ответа выводится no                                                             

      ,case when a.maker in (select Pr.maker from Product as Pr Left join Laptop LP_a on Pr.model = LP_a.model where Pr.type = 'laptop') 
            then 'yes(' + CAST ((SELECT COUNT(DISTINCT b.model) FROM laptop b, product c WHERE b.model=c.model AND c.type='laptop' AND c.maker=a.maker) AS VARCHAR) + ')'
            else 'no' END as Laptop

      ,case when a.maker in (select Pr.maker from Product as Pr Left join Printer Print_a on Pr.model = Print_a.model where Pr.type = 'Printer') 
            then 'yes(' + CAST ((SELECT COUNT(DISTINCT b.model) FROM printer b, product c WHERE b.model=c.model AND c.type='Printer' AND c.maker=a.maker) AS VARCHAR) + ')'
            else 'no' END as Printer

from Product a 
...
Рейтинг: 0 / 0
помогите с запросом
    #39976800
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Metaphor
Код: plsql
1.
select Pr.maker from Product as Pr Left join PC PC_a on Pr.model = PC_a.model where Pr.type = 'PC'

А зачем тут таблица PC ?
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / помогите с запросом
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]