SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 27.03.2012 13:24:06

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Нужно примерно следующее. Есть две таблицы.
filial - филиалы и otdel - отделения. Нужно вывести все филиалы паралельно объединить их с отделениями.
Делаю так


mysql_query(" SELECT filial.*, otdel.id,  GROUP_CONCAT(`oname`, `oadres`, `ophone`, `oopisanie`) as oname from  filial right join otdel USING (`id`) ");
 

В общем и целом все верно. Т.е. выводятся все поля филиалов и все сгруппированные поля oname отделений, но не выводятся поля, в который нет отделений, а их тоже нужно вывести, в дальнейшем нужно будет к данному запросу сделать функцию like, но это задача второстепенная, главное для начала вывести все филиалы, как с отделениями так и без.
Помогите решить проблему. В общем и целом получается следующее.


selector=1882

filialname=qwe

phone=+38(345)345Примечание:вап, +38(345)234Примечание:вапва, +38(345)324Примечание:авпва, +38(345)345Примечание:авпав
phone=+38(345)345Примечание:вап, +38(345)234Примечание:вапва, +38(345)324Примечание:авпва, +38(345)345Примечание:авпав


oname=111111asdasd11a,111111asdasd11a,111111asdasd11a,111111asdasd11a,111111asdasd11a,111111asdasd11a,111111asdasd11a,1112111asdasd11aa,1112111asdasd11aa,1112111asdasd11aa,1112111asdasd11aa,1112111asdasd11aa,1112111asdasd11aa,1112111asdasd11aa,1131111ewrweraaa,1131111ewrweraaa,1131111ewrweraaa,1131111ewrweraaa,1131111ewrweraaa,1131111ewrweraaa,1131111ewrweraaa,11141113wers11aaaa,11141113wers11aaaa,11141113wers11aaaa,11141113wers11aaaa,11141113wers11aaaa,11141113wers11aaaa,11141113wers11aaaa,5111sadasdaaaa,5111sadasdaaaa,5111sadasdaaaa,5111sadasdaaaa,5111sadasdaaaa,5111sadasdaaaa,5111sadasdaaaa,6111asdsaaaasasas,6111asdsaaaasasas,6111asdsaaaasasas,6111asdsaaaasasas,6111asdsaaaasasas,6111asdsaaaasasas,6111asdsaaaasasas


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#2 27.03.2012 14:13:12

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

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

right join заменить на left join ?

Неактивен

 

#3 27.03.2012 15:20:09

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

vasya написал:

right join заменить на left join ?

Спасибо, я тоже так думал, но такой вариант выводит первую строку из таблицы filial, и объединяет с ней таблицу из otdel, несмотря на то, что Id не совпадают. Может быть есть какие-то другие Варианты? При этом Остальные строки из таблицы filial не выводит.

На всякий случай замечу, что таблиц с филиалами у меня 2, и соответственно, таблицу с отделениями я планирую отнести как к одной, так и к другой таблице с филиалами, либо в крайнем случае можно создать две таблица. В итоге расчитываю получить что-то навроде (Одна объедененная таблица филиалов с отделениями) UNION ALL (вторая объедененная таблица филиалов с отделениями) далее выборка навроде where id='id' и/или like='like', т.к. возможно варианты с UNION могут не подойти, если только они не будут способны объеденить таблицы по такому варианту, или подобному варианту. Вариант навроде, приблизительно (SELECT tabl.filial1 join otdel) UNION ALL (SELECT tabl.filial2 join otdel) where id='id', работает, пока не используется GROUP_CONCAT(). Но так как, филиалы дублируются по количеству отделений, то необходимо их как-то объединить. Очень надеюсь на опыт и профессионализм участников форума.

Отредактированно platedz (27.03.2012 15:37:14)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#4 27.03.2012 15:22:12

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

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

group_concat на concat замените ещё.

Неактивен

 

#5 27.03.2012 15:41:09

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

vasya написал:

group_concat на concat замените ещё.

Все бы хорошо, но поля с филиалами и отделениями дублируются по количеству отделений. А мне нужны чтобы филиалы были оригинальными, а отделение было как бы в одной строке с филиалами.

Вариант с group_concat почти идеален, только выводит не все, у меня скажем 10 филиалов, и в одно 6 отделений. Мне нужно вывести 10 филиалов, и все 6 отделений занести в oname занести, чтобы потом через поиск посмотреть все совпадения через лайк и вывести только один филиал, а не по количеству отделений.

Отредактированно platedz (27.03.2012 15:50:29)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#6 27.03.2012 15:45:26

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

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Приведите тестовые данные
show create table `имя таблицы`
insert into `имя таблицы` values(),(),() -- строк на 10
и желаемый результат

Неактивен

 

#7 27.03.2012 16:02:22

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Таблица с филиалами

CREATE TABLE `filial` (
    `id` INT(11) NULL DEFAULT NULL,
    `name` TEXT NULL,
    `opisanie` TEXT NULL,
    `adres` TEXT NULL,
    `phone` TEXT NULL,
    PRIMARY KEY (`num`),
    FULLTEXT INDEX `namef` (`name`, `business`)
)
COLLATE='cp1251_general_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=480
 


Таблица с отделениями

CREATE TABLE `otdel` (
    `id` INT(11) NULL DEFAULT NULL,
    `oname` TEXT NULL,
    `oopisanie` TEXT NULL,
    `oadres` TEXT NULL,
    `ophone` TEXT NULL,
    PRIMARY KEY (`num`),
    FULLTEXT INDEX `namef` (`name`, `business`)
)
COLLATE='cp1251_general_ci'
ENGINE=MyISAM
ROW_FORMAT=DEFAULT
AUTO_INCREMENT=480
 


В таблице с filial
id=1, name=филиал1, opisanie=описание1, adres=адрес1, phone=телефон1
id=2, name=филиал2, opisanie=описание2, adres=адрес2, phone=телефон2
id=3, name=филиал3, opisanie=описание3, adres=адрес3, phone=телефон3

В таблице с otdel
id=1, oname=отдел1, oopisanie=отдел1, oadres=адресотдела1, ophone=телефонотдела1
id=1, oname=отдел2, oopisanie=отдел2, oadres=адресотдела2, ophone=телефонотдела2
id=3, oname=отдел3, oopisanie=отдел3, oadres=адресотдела3, ophone=телефонсотдела3

Как результат отдел объединил в GROUP_CONCAT(oname, oopisanie, oadres, ophone)
Получить нужно
d=1, name=филиал1, opisanie=описание1, adres=адрес1, phone=телефон1,
oname=отдел1, отдел1, адресотдела1,телефонотдела1,отдел2, отдел2,адресотдела2, телефонотдела2

id=2, name=филиал2, opisanie=описание2, adres=адрес2, phone=телефон2, oname=

id=3, name=филиал3, opisanie=описание3, adres=адрес3, phone=телефон3, oname=отдел3, адресотдела3, телефонсотдела3

Я привел всего три филиала, но надеюсь, что понятно. Сейчас сделаю конкретные таблицы, просто у меня там одни наброски.

Отредактированно platedz (27.03.2012 16:07:14)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#8 27.03.2012 16:17:15

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

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

select f.*, group_concat(oname, oopisanie, oadres, ophone) from pmd_filial f left join filial using(id) group by f.id,f.name,f.opisanie,f.adres,f.phone;

Неактивен

 

#9 27.03.2012 17:15:33

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Извините, если я чего-то не понял, уже голова не соображает, т.к. сижу уже со вчерашнего вечера, результата добился небольшого, но зато узнал много нового.
Вот точный код запроса





DROP TABLE IF EXISTS `filial`;
CREATE TABLE `filial` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` text,
  `opisanie` text,
  `adres` text,
  `phone` text,
  PRIMARY KEY (`id`),
  FULLTEXT KEY `name` (`name`,`opisanie`)
) TYPE=MyISAM AUTO_INCREMENT=4;

INSERT INTO `filial` VALUES (1,'Название филиала 1','Название филиала 1','Адрес филиала 1','Телефон филиала 1');
INSERT INTO `filial` VALUES (2,'Название филиала 2','Название филиала 2','Адрес филиала 2','Телефон филиала 2');
INSERT INTO `filial` VALUES (3,'Название филиала 3','Название филиала 3','Адрес филиала 3','Телефон филиала 3');


DROP TABLE IF EXISTS `otdel`;
CREATE TABLE `otdel` (
  `id` int(11) DEFAULT NULL,
  `oname` text,
  `oopisanie` text,
  `oadres` text,
  `ophone` text,
  `num` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`num`),
  FULLTEXT KEY `oname` (`oname`,`oopisanie`)
) TYPE=MyISAM AUTO_INCREMENT=4;



INSERT INTO `otdel` VALUES (1,'Отдел первого филиала 1','Описание отдела 1','Адрес отдела 1','Телефон отдела 1',1);
INSERT INTO `otdel` VALUES (1,'Отдел первого филиала 2','Описание отдела 2','Адрес отдела 2','Телефон отдела 2',2);
INSERT INTO `otdel` VALUES (3,'Отдел третьего филиала 3','Описание отдела 3','Адрес отдела 3','Телефон отдела 3',3);


 


Делаю запрос


$rjoin = mysql_query(" SELECT filial.*, group_concat(`oname`, `oopisanie`, `oadres`, `ophone`) from  otdel o left join filial USING (`id`) group by o.id, o.oopisanie, o.oadres, o.ophone ");
while($fjoin = $db->fetcharray ( $rjoin )) {
foreach($fjoin as $key => $val){
echo $key ."=".$val." <br>";
}
echo "<hr>";
}
 



Получаю результат


id=1
name=Название филиала 1
opisanie=Название филиала 1
adres=Адрес филиала 1
phone=Телефон филиала 1
5=Отдел первого филиала 1Описание отдела 1Адрес отдела 1Телефон отдела 1
group_concat(`oname`, `oopisanie`, `oadres`, `ophone`)=Отдел первого филиала 1Описание отдела 1Адрес отдела 1Телефон отдела 1

id=1
name=Название филиала 1
opisanie=Название филиала 1
adres=Адрес филиала 1
phone=Телефон филиала 1
5=Отдел первого филиала 2Описание отдела 2Адрес отдела 2Телефон отдела 2
group_concat(`oname`, `oopisanie`, `oadres`, `ophone`)=Отдел первого филиала 2Описание отдела 2Адрес отдела 2Телефон отдела 2

id=3
name=Название филиала 3
opisanie=Название филиала 3
adres=Адрес филиала 3
phone=Телефон филиала 3
5=Отдел третьего филиала 3Описание отдела 3Адрес отдела 3Телефон отдела 3
group_concat(`oname`, `oopisanie`, `oadres`, `ophone`)=Отдел третьего филиала 3Описание отдела 3Адрес отдела 3Телефон отдела 3

Соответственно, первый и второй результат должен вывестить как один, но с объединенными отделами, а второй без отделов, но он упущен, из-за отсутствия отделов, третий также, но вывод все равно идет по отделам

Отредактированно platedz (27.03.2012 17:16:43)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#10 27.03.2012 17:30:42

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

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

См мой прошлый ответ. В приведенном мной запросе порядок объединения таблиц другой, и группировка по полям таблицы филиалов.

Неактивен

 

#11 27.03.2012 17:56:41

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Спасибо большое, все вышло.

На всякий случай код


$rjoin = mysql_query(" SELECT filial.*, group_concat(`oname`, `oopisanie`, `oadres`, `ophone`) from  filial left join otdel USING (`id`) group by filial.id, filial.opisanie, filial.adres, filial.phone  ");
 


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


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#12 27.03.2012 18:01:52

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

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

А это разве не документация - http://dev.mysql.com/doc/refman/5.5/en/

Неактивен

 

#13 27.03.2012 18:31:41

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Это конечно, документация, только с английским у меня проблема.
Да и по русски документация документации рознь.
Вообще раньше никогда не придавал такого значения mysql, в первую очередь потому, что считал, что в mysql достаточно сложно лавировать и объединять данные, поэтому привык больше работать с файлами в своих проектах. И как следствие с mysql работал очень мало те. обычно с простыми запросами. Хотелось бы почитать  и иметь под рукой что-нибудь достаточно понятное с хорошими примерами.


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#14 28.03.2012 19:31:02

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Все бы здорово, но теперь никак не могу применить like к данному запросу, в именно к group_concat, с отсальными все нормально. Пробовал назначить группе алианс и искать совпадение в алиансе. Подскажите, пожалуйста, как теперь like примерить. Т.е. скажем мне нужно найти слово мебель в названии фирмы, описании, и в отделе, который получился в результате group_concat


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#15 28.03.2012 20:02:54

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

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

select f.*, group_concat(oname, oopisanie, oadres, ophone) qq
from pmd_filial f left join filial using(id) group by f.id,f.name,f.opisanie,f.adres,f.phone
having qq like'%мебель%';

Неактивен

 

#16 28.03.2012 20:34:18

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Спасибо огромное еще раз. Если не сложно, то хотелось бы уточнить. Попробовал поискать в яндексе описание фукнции having, но нашел только то, что having отличается от where в том, что она может искать в функциях. Насколько я понял, то group_concat - это функция, и для поиска в ее результате нужно использовать having. В остальном having аналогичен функции where и я могу искать строку в нескольких столбцах и по нескольким параметрам также, как и с использованием where. Правильно я понимаю? Хотя так и осталось неясным, почему используя having я могу искать запрос в конце таблицы, а с помощью where перед group by?
Также хотелось бы учтоничть значения поля
group_concat(oname, oopisanie, oadres, ophone) qq
я использовал
group_concat(oname, oopisanie, oadres, ophone) as qq
Как бы не очень понятно в чем разница, и видимо само значение данной записи?
Если объясните, хотя бы в двух словах,  буду крайне признателен.


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#17 28.03.2012 20:37:51

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

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

as необязательное ключевое слово
having это условие where применяемое после группировки

Неактивен

 

#18 28.03.2012 21:12:09

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

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


(" (SELECT filial.*, group_concat(`oname`, `oopisanie`, `oadres`, `ophone`) from  filial left join otdel USING (`id`) group by filial.id, filial.opisanie, filial.adres, filial.phone) UNION ALL  (SELECT filial.*, group_concat(`oname`, `oopisanie`, `oadres`, `ophone`) from  filial left join otdel USING (`id`) group by filial.id, filial.opisanie, filial.adres, filial.phone) having или что-то навроде этого. ")
 


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#19 28.03.2012 21:22:34

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

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Что-то я суть последнего вопроса не уловил.

Неактивен

 

#20 28.03.2012 21:48:24

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Имеется ввиду сделать выборку после объединения таблиц с помощью UNION


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#21 28.03.2012 21:53:19

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

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

select .. from (select .. union all select ..) t ..;

Неактивен

 

#22 29.03.2012 00:22:17

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Спасибо. Получилось. Извините за навязчивость, но у меня еще один вопрос возник. Я попробовал изменить идентификаторы и отделения одного филиала, думаю, что на практике такое часто может понадобиться, т.ч. буду крайне признателен если подскажите ответ и на этот вопрос.
Получилось следующее


(" (SELECT filial.*, group_concat(`oname`, `oopisanie`, `oadres`, `ophone`) from  filial left join otdel USING (`id`) group by filial.id, filial.opisanie, filial.adres, filial.phone) UNION ALL  (SELECT filial2.*, group_concat(`oname`, `oopisanie`, `oadres`, `ophone`) from  filial2 left join otdel2 USING (`id2`) group by filial.id2, filial.opisanie, filial.adres, filial.phone)  ")
 


У filial и otdel идентификатор id, а у filial2 и otdel2 идентификатор id2. Как-то можно их объединить, т.е. чтобы весь запрос был или c id или c id2. Я так понимаю это нужно делать через алианс, но на практике почему-то не получатеся, да и вовсе не работает

Отредактированно platedz (29.03.2012 00:26:50)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#23 29.03.2012 03:58:07

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Описанная выше проблема решила в какой-то мере. Я заменил поля со * на конкрекретные названия полей, которые присутствуют в обоих таблицах навроде filial.id2, filial.opisanie, filial.adres, filial.phone. Насколько я понял, при группировке с union если USING и поля отсутствуют хотя бы  в одной из таблиц, то ожидаемого мною объединения не происходило. И хотя данной реализации для меня вроде бы достаточно, по крайней мере на данный момент, но все-таки хотелось бы понять, что если у меня в таблице filial есть поле director, которого нет в таблице filial2, но мне нужно, чтобы это поле тоже выводилось в сгруппированном запросе. И что возможно более Важно, если мне нужно, чтобы поле director из таблицы filial подставлялось в таблицу filial2, скажем по полю index, где Index - это индекс двух филиалов с одним директором. И возможно ли при слитых таблицах с разными USING и сгруппированными с помощью UNION вывести все поля т.е. со * из обоих таблиц?

Отредактированно platedz (29.03.2012 04:00:56)


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#24 18.04.2012 17:46:49

platedz
Старожил
Зарегистрирован: 27.03.2012
Сообщений: 314

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Спасибо большое за ответы. Вроде все вышло. Единственная просьба, не могли бы вы объяснить, как работает group by, сколько не читал про него, так и не понял конкретно, особенно в моем случае, при объединении 4 таблиц.


Wazzup.su - это сервис объединивший в себе все в одном.

Неактивен

 

#25 18.04.2012 19:33:03

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Помогите Объединить две таблицы с GROUP_CONCAT или другим возможным способом

Количество таблиц не играет роли - все равно в итоге получается выборка строк, в которых имеется несколько полей.

Принцип работы group by - сжатие по некоторому признаку.

Допустим, есть таблица, в которой перечислены зарплаты сотрудников.
Содержимое таблицы - идентификаторы отделов, идентификаторы сотрудников и непосредственно зарплаты сотрудников.

worker_id department_id salary
1            1                  1000
2            1                  2000
3            2                  3000
4            2                  4000
5            2                  5000
6            3                  6000

Если нужно получить суммарную зарплату по отделам:
SELECT department_id, sum(salary) FROM t GROUP BY department_id;
Если нужно получить максимальную зарплату по каждому отделу:
SELECT department_id, max(salary) FROM t GROUP BY department_id;


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

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