Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Вложенный MySQL запрос  (Прочитано 2592 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6844
    • Просмотр профиля
Вложенный MySQL запрос
« : 18 Сентября 2010, 04:58:07 »
ЧЯДНТ?
SELECT *
FROM `client`
WHERE `c_id`
IN (
    SELECT `c_id`
    FROM `client_category`
    WHERE `k_id`
    IN (
        SELECT `c_id`
        FROM `category`
        WHERE `up_id` = 1266
    )
    GROUP BY `c_id`
)
ORDER BY `c_id` ASC
не работает и всё тут...
вот эта часть
    SELECT `c_id`
    FROM `client_category`
    WHERE `k_id`
    IN (
        SELECT `c_id`
        FROM `category`
        WHERE `up_id` = 1266
    )
    GROUP BY `c_id`
работает
вот так тоже
SELECT *
FROM `client`
WHERE `c_id`
IN ( 47, 23432, 382 )
ORDER BY `c_id` ASC
а почему всё вместе не работает не понимаю... :-\

Lifewalker

  • Гость
Re: Вложенный MySQL запрос
« Ответ #1 : 18 Сентября 2010, 07:37:58 »
А если убрать GROUP BY `c_id` в первом вложении SELECT?
Возможно отказывается работать из-за попытки группировки в условии отбора?

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6844
    • Просмотр профиля
Re: Вложенный MySQL запрос
« Ответ #2 : 18 Сентября 2010, 09:11:38 »
тоже возникала такая мысля, но не оно, я и ORDER убирал.

Lifewalker

  • Гость
Re: Вложенный MySQL запрос
« Ответ #3 : 18 Сентября 2010, 10:03:00 »
Попробуйте так:
SELECT *
FROM `client`
WHERE `c_id`
(
SELECT `c_id`
FROM `client_category`
WHERE `k_id`
(
SELECT `c_id`
FROM `category`
WHERE `up_id` = 1266
)
)
ORDER BY `c_id` ASC
Меня смущает наличие в вашем запросе IN, который должен вроде как перебирать значения. В вашем случае возвращено должно быть только одно, может быть (соломинка...) это является причиной?

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6844
    • Просмотр профиля
Re: Вложенный MySQL запрос
« Ответ #4 : 18 Сентября 2010, 11:30:30 »
везде, где использовался IN множество значений.
в общем решил проблему пошаговой выборкой, сделал массив элементов
    SELECT `c_id`
    FROM `client_category`
    WHERE `k_id`
    IN (
        SELECT `c_id`
        FROM `category`
        WHERE `up_id` = 1266
    )
    GROUP BY `c_id`
Потом вытягивал то, что мне нужно используя значения этого массива (пхп-скриптом).

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6844
    • Просмотр профиля
Re: Вложенный MySQL запрос
« Ответ #5 : 22 Сентября 2010, 08:10:30 »
кажется я понял в чём дело, тут вот снова ситуёвина возникла из которой ясно, что запрос рабочий, просто время его работы слишком велико.

SELECT `name`
FROM `category`
WHERE `c_id`
IN ( 1264 )
время - 0.0004с
---------------------
SELECT `k_id`
FROM `client_category`
WHERE `c_id` =384
GROUP BY `k_id`
время - 0.005
--------------
а если засунуть один в другой
SELECT `name`
FROM `category`
WHERE `c_id`
IN (
SELECT `k_id`
FROM `client_category`
WHERE `c_id` =384
GROUP BY `k_id`
)
время - 30с

это видимо потому, что вложенный запрос возвращает не просто число, а структуру. Внимание вопрос: как внутри запроса избавится от струтуры, т.е. сделать Fetch и выбрать из массива нужный элемент?

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Вложенный MySQL запрос
« Ответ #6 : 22 Сентября 2010, 08:32:52 »
Не уверен, что mySQL поддерживает вложенные запросы. Это не постгреескуэл.
До недавнего времени это было так, сейчас может быть уже и по другому.
Выход простой.
Используйте пхп структуры для хранения промежуточных данных.
Немного криво, но универсально.
ЗЫ. Где-то у Дюбуа есть решение таких проблем за счет формирования промежуточных выборок.
Но это уже к спецам по скулам.
« Последнее редактирование: 22 Сентября 2010, 08:39:06 от alexander.pronin »

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6844
    • Просмотр профиля
Re: Вложенный MySQL запрос
« Ответ #7 : 22 Сентября 2010, 09:31:48 »
Не уверен, что mySQL поддерживает вложенные запросы. Это не постгреескуэл.
Поддерживает, выше рабочие примеры, проблема в том, как разбирать структуру внутри запроса.

В Пхп решил проблему так:
while ($k_id = $db_k_id->Fetch()) {
            $arK_id[] = $k_id['k_id'];
        }
        $sK_id = implode(",",$arK_id);
потом в запросе в IN ($sK_id)

Оффлайн yuryzh

  • Новичок
  • *
  • Сообщений: 38
    • Просмотр профиля
Re: Вложенный MySQL запрос
« Ответ #8 : 22 Сентября 2010, 09:38:01 »
а  зачем здесь вложенные запросы? объедини все в один.
SELECT DISTINCT c.name name
FROM category c, client_category k
WHERE (k.c_id = 384) and (c.c_id = k.k_id)

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6844
    • Просмотр профиля
Re: Вложенный MySQL запрос
« Ответ #9 : 22 Сентября 2010, 09:53:24 »
переведи запрос на русский, а то я как-то недостаточно ясно понимаю его работу.

Оффлайн yuryzh

  • Новичок
  • *
  • Сообщений: 38
    • Просмотр профиля
Re: Вложенный MySQL запрос
« Ответ #10 : 22 Сентября 2010, 09:56:31 »
переведи запрос на русский, а то я как-то недостаточно ясно понимаю его работу.
это полный аналог этого твоего запроса, только без вложенности
SELECT `name`
FROM `category`
WHERE `c_id`
IN (
SELECT `k_id`
FROM `client_category`
WHERE `c_id` =384
GROUP BY `k_id`
)

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Вложенный MySQL запрос
« Ответ #11 : 22 Сентября 2010, 10:07:23 »
а  зачем здесь вложенные запросы? объедини все в один.
SELECT DISTINCT c.name name
FROM category c, client_category k
WHERE (k.c_id = 384) and (c.c_id = k.k_id)

Вот про это я говорил, когда упоминал Дюбуа.

Оффлайн yuryzh

  • Новичок
  • *
  • Сообщений: 38
    • Просмотр профиля
Re: Вложенный MySQL запрос
« Ответ #12 : 22 Сентября 2010, 10:07:39 »
А если попытаться переписать твой самый первый запрос, то получится нечто подобное... (не проверял, так что работоспособность не гарантирую)
SELECT DISTINCT c.name name , c.c_id c_id
FROM client c, client_category k, category kk
WHERE (c.c_id = k.k_id) AND (k.c_id = kk.c_id) AND (kk.up_id = 1266)
ORDER BY c_id ASC
На самом деле логика простая: все конструкции IN надо заменить на условие в WHERE

Оффлайн thunderamur

  • Автор темы
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 6844
    • Просмотр профиля
Re: Вложенный MySQL запрос
« Ответ #13 : 22 Сентября 2010, 10:40:04 »
угу, спасибо, то, что надо, только последний запрос возвращает ноль, но предыдущий показывает что надо, щас разберусь и с 1-м)))

 

Страница сгенерирована за 0.016 секунд. Запросов: 22.