ФорумСообществоПрофессиональная деятельностьПредлагаю работу → Требуется программист PHP, Москва, м. Каширская, от 50000 руб.

Требуется программист PHP, Москва, м. Каширская, от 50000 руб.

  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 11 апреля 2012 г. 14:05, спустя 3 часа 31 минуту 3 секунды

    Tekuto, нет, ты хоть бы сам проверил
  • artoodetoo

    Сообщения: 5146 Репутация: N Группа: в ухо

    Spritz 11 апреля 2012 г. 22:25, спустя 8 часов 20 минут 41 секунду

    Напишите запрос который бы по имени менеджера выводил бы названия городов, в которых менеджер не осуществил ни одной сделки.


    весь фокус задания в этом "не" )))
    начнем от обратного:
    шаг 1

    SELECT c.`name`
       FROM
         `cross` AS x INNER JOIN
         `cities` AS c ON c.`id` = x.`city_id` INNER JOIN
         `managers` AS m ON m.`id` = x.`manager_id`
       WHERE
         m.login = 'mary'

    выведет все города, где Мэри имела успех

    шаг 2. неуспех. есть такая операция NOT IN

    SELECT c.`name`
    FROM
     `cities` AS c
    WHERE
     c.`id` NOT IN (
       SELECT c.`id`
       FROM
         `cross` AS x INNER JOIN
         `cities` AS c ON c.`id` = x.`city_id` INNER JOIN
         `managers` AS m ON m.`id` = x.`manager_id`
       WHERE
         m.login = 'mary')

    bingo! выведутся те города, которые не попали в предыдущий список

    шаг 3 (необязательный). перенесем подзапрос во фразу FROM. просто синтаксический сахар

    SELECT c.`name`
    FROM
     `cities` AS c LEFT JOIN
     ( SELECT c.`id`
       FROM
         `cross` AS x INNER JOIN
         `cities` AS c ON c.`id` = x.`city_id` INNER JOIN
         `managers` AS m ON m.`id` = x.`manager_id`
       WHERE
         m.login = 'mary' ) AS c2 ON c2.`id` = c.`id`
    WHERE
     c2.`id` IS NULL


    PROFIT!
    ιιlllιlllι унц-унц
  • Tekuto

    Сообщения: 1147 Репутация: N Группа: Адекваты

    Spritz 12 апреля 2012 г. 7:43, спустя 9 часов 17 минут 27 секунд


    Tekuto, нет, ты хоть бы сам проверил

    Ну да, не проверял.

    Так твой вопрос по поводу одного SELECT остался без ответа?
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 12 апреля 2012 г. 8:35, спустя 52 минуты 27 секунд

    artoodetoo,
    можно без двух селект. задание фигня.

    …………. PROFIT!

    чё то ты не особо справился ))

    Так твой вопрос по поводу одного SELECT остался без ответа?

    Похоже что так ))
  • artoodetoo

    Сообщения: 5146 Репутация: N Группа: в ухо

    Spritz 12 апреля 2012 г. 9:31, спустя 56 минут 15 секунд

    kostyl, ну это ты хуйню придумал про один SELECT ))) нечего подзапросов стесняться. по сути джойны ничем принципиально от подзапросов не отличаются
    вычитание самая неудобная операция в реляционной алгебре. так что вот так вот

    у меня была версия с лишним двойном по cities и без подзапроса. но она выдает хлам в частном случае - если менеджер везде наследил. поэтому не привожу

    вот есть некоторое подобие, правда параметром не имя менеджера, а его id, что на практике несерьезное ограничение :)

    SELECT c.`name`
    FROM
    `cities` AS c LEFT JOIN
    `cross` AS x ON c.`id` = x.`city_id`AND x.`manager_id`=2
    GROUP BY c.`name`
    HAVING count(*) <> count(x.city_id)
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 12 апреля 2012 г. 9:15, спустя 23 часа 43 минуты 35 секунд

    artoodetoo, короче ты не отмазался ))
  • artoodetoo

    Сообщения: 5146 Репутация: N Группа: в ухо

    Spritz 12 апреля 2012 г. 20:02, спустя 10 часов 47 минут 8 секунд

    см. выше.
    данные и все запросы здесь

    update: перезалил архив
    1. cross.zip (16)
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 12 апреля 2012 г. 9:51, спустя 13 часов 49 минут 6 секунд

    artoodetoo, см. выше. ;)
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 12 апреля 2012 г. 12:36, спустя 2 часа 45 минут

    я же писал про левый джоин и WHERE foo IS NULL
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 12 апреля 2012 г. 13:01, спустя 25 минут

    Абырвалг, точно, значит я старею…
    Select c.city_name, m.*, cr.* from cities c 
    left join `cross` cr on cr.city_id = c.city_id
    left join managers m on m.manager_id = cr.manager_id
    where cr.manager_id is NULL OR (m.manager_name = 'ololo' AND cr.count = 0)
  • artoodetoo

    Сообщения: 5146 Репутация: N Группа: в ухо

    Spritz 12 апреля 2012 г. 20:05, спустя 7 часов 3 минуты 36 секунд

    kostyl, что-то ты замудрил с условиями. оно нерабочее

    вот рабочий запрос без подзапросов, как ты хотел:
    SELECT c.`name`
    FROM
     `cross` AS x INNER JOIN
     `managers` AS m ON m.`id`= x.`manager_id` AND m.`login` = 'mary' RIGHT JOIN
     `cities` AS c ON c.`id` = x.`city_id`
    WHERE x.num_deals IS NULL


    архив выше перезалил. мне понравилось )))
    ιιlllιlllι унц-унц
  • kostyl

    Сообщения: 5210 Репутация: N Группа: Джедаи

    Spritz 14 апреля 2012 г. 2:24, спустя 1 день 6 часов 19 минут

    artoodetoo, да, я вообще какую то хуйню написал )))
    Ты молодец, как раз тут RIGHT JOIN рулит.
    Я еще рассматривал условие, когда есть записть в х с количеством ноль, так что полное решение, будет как у тебя + фигня

    SELECT c.`name`
    FROM
    `cross` AS x INNER JOIN
    `managers` AS m ON m.`id`= x.`manager_id` AND m.`login` = 'mary' RIGHT JOIN
    `cities` AS c ON c.`id` = x.`city_id`
    WHERE x.num_deals IS NULL OR x.cc = 0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!