SQLinfo.ru - Все о MySQL Highload++ 2017

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 30.06.2017 22:32:08

remenikomer
Участник
Зарегистрирован: 28.05.2016
Сообщений: 23

Нужно передать в подзапрос данные

Нужно данные из столбца arr_parent_obj передать в подзапрос.
В столбце данные, например, 0,1,216.
Если в условие подзапроса IN указать прямо (0,1,216), то все работает. А если алиас - все null.
Задача: вывести адрес (страна, регион, город). Структура таблицы вложенная, как категории.
Часть запроса следующий:

SELECT
                dle_post_objects.id AS objectid,
        dle_post_objects.full_name,
        dle_post_area.arrparentid AS <strong>arr_parent_obj</strong>,
        ( SELECT   GROUP_CONCAT( `areaname` SEPARATOR ', ' ) AS full_adr FROM dle_post_area WHERE areaid IN ( <strong>arr_parent_obj</strong> )  )  AS adr_area
  FROM dle_post_objects
   
     LEFT JOIN dle_post_area
                ON dle_post_area.areaid = dle_post_objects.areaid

    WHERE dle_post_objects.areaid > 0

     

Отредактированно remenikomer (30.06.2017 22:33:07)

Неактивен

 

#2 30.06.2017 22:45:26

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5269

Re: Нужно передать в подзапрос данные

WHERE find_in_set(areaid,arr_parent_obj)

Неактивен

 

#3 30.06.2017 22:55:55

remenikomer
Участник
Зарегистрирован: 28.05.2016
Сообщений: 23

Re: Нужно передать в подзапрос данные

vasya написал:

WHERE find_in_set(areaid,arr_parent_obj)

но очень тяжелый запрос получается, 3 секунды на 60 строк то

Неактивен

 

#4 30.06.2017 23:28:04

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5269

Re: Нужно передать в подзапрос данные

find_in_set не использует индекс
чтобы использовать in надо менять структуру и не хранить данные через запятую

Неактивен

 

#5 30.06.2017 23:49:01

remenikomer
Участник
Зарегистрирован: 28.05.2016
Сообщений: 23

Re: Нужно передать в подзапрос данные

vasya написал:

find_in_set не использует индекс
чтобы использовать in надо менять структуру и не хранить данные через запятую

и как сделать по другому? Можно без find_in_set?

Неактивен

 

#6 01.07.2017 00:02:31

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5269

Re: Нужно передать в подзапрос данные

покажите структуру таблиц show create table..
тестовые данные insert into ..
и что должен вернуть запрос

Неактивен

 

#7 01.07.2017 00:14:37

remenikomer
Участник
Зарегистрирован: 28.05.2016
Сообщений: 23

Re: Нужно передать в подзапрос данные

vasya написал:

покажите структуру таблиц show create table..
тестовые данные insert into ..
и что должен вернуть запрос

CREATE TABLE db.dle_tb_area (
  areaid int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  areaname varchar(50) NOT NULL DEFAULT '',
  parentid int(10) UNSIGNED NOT NULL DEFAULT 0,
  arrparentid varchar(255) NOT NULL DEFAULT '',
  child tinyint(1) NOT NULL DEFAULT 0,
  arrchildid text NOT NULL,
  listorder smallint(4) UNSIGNED NOT NULL DEFAULT 0,
  un_name varchar(255) NOT NULL,
  act enum ('1', '0') NOT NULL DEFAULT '0',
  dispsite enum ('0', '1') NOT NULL DEFAULT '0' ,
  PRIMARY KEY (areaid)
)
ENGINE = MYISAM
AUTO_INCREMENT = 18755
AVG_ROW_LENGTH = 65
CHARACTER SET utf8
COLLATE utf8_general_ci
COMMENT = 'Локации';


Есть еще куча таблиц. Задача, сделать выборку объектов из другой таблицы по areaid и в новую колонку сформировать адрес (страна, регион, город).

Отредактированно remenikomer (01.07.2017 00:15:29)


Прикрепленные файлы:
Attachment Icon dle_db_area.sql, Размер: 14,141 байт, Скачано: 28

Неактивен

 

#8 01.07.2017 00:48:25

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5269

Re: Нужно передать в подзапрос данные

с помощью WITH в MySQL 8 / MaiaDB 10.2
http://sqlinfo.ru/articles/info/28.html

в более ранних версиях придется с помощью процедуры
http://sqlinfo.ru/articles/info/22.html

если уровень вложенности фиксирован, т.е. всегда (страна, регион, город), то 2 раза left join таблицы на саму себя

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson