SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#26 18.04.2012 22:15:59

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

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

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



("SELECT * FROM(SELECT f2.name, f2.adres, group_concat("здесь все понятно") otdel from  f2 left join  f2otdel USING (`id2`) group by f2.id  UNION  SELECT f1.name2, f1.adres group_concat("здесь все понятно") otdel2 from  f1 left join f1otdel USING (`id1`)  group by f2.id ) alians having selector LIKE '%???%' LIMIT 10")

 



Таблицы f2 и f2otdel объединены общим  id2
Таблицы f1 и f1otdel объединены общим id1
В таблице f2 name(название фирмы)
В таблице f1 name2 (название фирмы) при этом в ней есть также и поле name

Неясным осталось следующее:
Я пробовал задать поле f2.name as name2, ожидая получить, поле f2.name2 через алианс, но не понял, почему этого не произошло.

Но получилось вышеуказанным образом, и я получил значение поля name2, но в массиве с названием name. Почему? Я ожидал получить как поле name, так и поле name2?

И последний вопрос. Насколько я понял

select * from (select .. union all select ..) alians ..;
 

создает сгруппированное поле alians, через алианст, и если так, то почему не проходит выборка c указанием ограниченного количества полей навроде alians.name


select alians.name from (select .. union all select ..) alians ..;
 


Подскажите, пожалуйста, что я не верно понимаю?

Отредактированно platedz (18.04.2012 22:17:28)


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

Неактивен

 

#27 22.04.2012 20:09:13

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

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

Насколько я понял первые два вопроса причина в UNION. Хотя сам вопрос с алиансами остался несовсем ясным, но по крайней мере то как правильно манипулировать с данными через юнион я вроде разобрался.

Неясным остался лишь вопрос, почему при таком синтаксите

select alians.name from (select .. union all select ..) alians ..;

я не могу Выбрать данные по названию таблиц через алианс.

У меня возник еще один вопрос. Думаю, что данный вопрос описан в документации по mysql, но я к сожалению так его и не нашел.

При попытке объединить таблицы следующим образом


select n1.string1, n1.string2....и тд...n3.string33, n3.string34..и тд.  from name1 n1 left join name1 n3 UNION ALL select n2.string1, n2.string2....и тд...n3.string33, n3.string34..и тд.  from name2 n2 left join name1 n3
 

Я не смог вывести больше 75 полей. Насколько я понял в Mysql существуют какие-то ограничения либо по объединению, либо по количеству полей в принципе. Где-то читал, что в mysql нельзя объединить то ли больше 61 или 63 таблиц то ли полей. Но к сожалению так и не смог найти никакой информации по конкретным ограничения в этот раз. Уважаемые создатели и участники форума, подскажите, пожалуйста, какие существуют ограничения и при каких условиях или хотя бы где конкретно можно посмотреть какую-то (крайне желательно руссифицированную информацию) по этому поводу

P.S. Большое спасибо всем ответившим на мои предыдущие обращения и в первую очередь vasya, т.к. данная информация довольно сильно помогла разобраться в ранее незнакомых конструкциях mysql.


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

Неактивен

 

#28 22.04.2012 20:28:02

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

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

platedz написал:

Неясным остался лишь вопрос, почему при таком синтаксите

select alians.name from (select .. union all select ..) alians ..;

я не могу Выбрать данные по названию таблиц через алианс.

Данная выборка вернет вам столбец alians.name
Кроме как по этому имени к нему уже никак обратиться не получиться. Или вы что-то другое подразумеваете под "Выбрать данные по названию таблиц через алианс"?


platedz написал:

У меня возник еще один вопрос. Думаю, что данный вопрос описан в документации по mysql, но я к сожалению так его и не нашел.

При попытке объединить таблицы следующим образом


select n1.string1, n1.string2....и тд...n3.string33, n3.string34..и тд.  from name1 n1 left join name1 n3 UNION ALL select n2.string1, n2.string2....и тд...n3.string33, n3.string34..и тд.  from name2 n2 left join name1 n3
 

Я не смог вывести больше 75 полей. Насколько я понял в Mysql существуют какие-то ограничения либо по объединению, либо по количеству полей в принципе. Где-то читал, что в mysql нельзя объединить то ли больше 61 или 63 таблиц то ли полей. Но к сожалению так и не смог найти никакой информации по конкретным ограничения в этот раз. Уважаемые создатели и участники форума, подскажите, пожалуйста, какие существуют ограничения и при каких условиях или хотя бы где конкретно можно посмотреть какую-то (крайне желательно руссифицированную информацию) по этому поводу

С помощью join можно объединить 61 таблицу (ссылку не дам).

Неактивен

 

#29 22.04.2012 22:10:03

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

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

Данная выборка вернет вам столбец alians.name
Кроме как по этому имени к нему уже никак обратиться не получиться. Или вы что-то другое подразумеваете под "Выбрать данные по названию таблиц через алианс"?

Спасибо, но я имел ввиду, что я не смог сделать выборку указав непосредственно поле alians.name. Правда я пытался вернуть только одно поле, а в сгруппированном запросе их значительно больше.


С помощью join можно объединить 61 таблицу (ссылку не дам).

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


select * from(
select tableA..... as A from tableA as C
ON A.id=C.id
UNION ALL  
select tableB..... as B from tableA as C
ON B.id=C.id ) having ....
 

Но больше 74 или 75 полей вывести не смог.


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

Неактивен

 

#30 23.04.2012 01:54:53

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

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

А какая у Вас версия MySQL? я легко объединил 200-колоночные таблички в 5.5...

Неактивен

 

#31 23.04.2012 22:02:44

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

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

Проблема с колонками оказалась моя вина, т.к. я дважды занес названия колонок в массив. Извините за беспокойство.

Тем не менее остался неясным вопрос с выборкой через алиансы. Функция  mysql_fetch_field() показала, что таблица действительно называется именем алианса,  но выбрать обращением alians.id из такого сгруппированного запроса данные я не могу. Зато получилось выбрать все при указании каждого поля в отдельности. Насколько я понял, из любого сгруппированного запроса выбрать можно только все сгруппированные поля. Правильно ли я понял?


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

Неактивен

 

#32 24.04.2012 00:00:04

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

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

Теперь вроде и вовсе во всем разобрался. Я хотел добавить таблицу, но только после того, как получу из нее данные. Со звездочкой было намного удобнее, чем с созданием массива всех необходимых полей. Проблему решил tableA.*, tableB.id.

Тем не менее остался один последний вопрос. Помогите, пожалуйста, решить его. При группировке через group_concat, данные сливаются в одну строку. Поля я могу разделить при необходимости через парамент SEPARATOR, а могу ли я разделить колонки каким либо образом. Т.е.  также как это делает CONCAT_WS, но внутри group_concat


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

Неактивен

 

#33 24.04.2012 00:07:35

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

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

А каким образом CONCAT_WS разделяет колонки? Что я не пойму о чем идет речь. Пример приведите.

Неактивен

 

#34 24.04.2012 15:30:50

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

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

Запрос с CONCAT_WS


CONCAT_WS("::", fil.id, fil.name,fil.adres)
 

получил
"Название :: Описание :: Адрес"
Но в запрос вошло только одно поле


Запрос с group_concat

group_concat(fil.id, fil.name,fil.adres SEPARATOR ' || ')
 

получил
"НазваниеОписаниеАдрес || Название2Описание2Адрес2 "
в запрос вошли все поля, но колонки слились

Я подумал, что было бы полезно получить что-то навроде

"Название :: Описание :: Адрес || Название2 :: Описание2 :: Адрес2 "

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


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

Неактивен

 

#35 24.04.2012 23:51:56

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

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

select group_concat(CONCAT_WS("::", fil.id, fil.name,fil.adres) SEPARATOR ' || ') ...

Неактивен

 

#36 25.04.2012 00:47:08

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

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

Спасибо, огромное. Вышло. Даже и не знал, что так можно. Все-таки чего-то я наверное недопонимаю в mysql. Еще раз большое спасибо.


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

Неактивен

 

#37 26.04.2012 16:24:06

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

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

Подскажите, пожалуйста, а возможно ли выбрать все колонки кроме определенных. Т.е. скажем у меня в базе 3 колонки, table.id, table.name, table.adres, мне нужно выбрать все, кроме table.adres. Что-то навроде
select table.* кроме table.adres
Возможно ли записать как-то это "кроме" в Mysql запросе?

Отредактированно platedz (26.04.2012 20:24:44)


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

Неактивен

 

#38 26.04.2012 23:41:47

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

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

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


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

Неактивен

 

#39 26.04.2012 23:50:43

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

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

Такое ощущение, что нет. Разве что дико извращаться - лезть в information schema, формировать запрос динамически и. т. д. В чем проблема перечислить все нужные столбцы?


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

Неактивен

 

#40 27.04.2012 00:22:40

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

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

Особой проблемы нет, но было бы значительно удобнее если бы можно было выбрать все кроме одной. Просто уже не в первый раз встречаюсь с подобной необходимость, а в этот раз и таблиц еще надо перечислить несколько. Думал, что если что-то подобное существуют, то подскажет кто-нибудь. Люди здесь более знающие и опытные чем я. Да и знания никогда лишними не бывают. В любом случае, большое спасибо за ответ. Буду считать, что такой возможности нет, раз ни в поисковике, ни в документации, не нашел ничего, ни здесь.


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

Неактивен

 

#41 27.04.2012 00:25:06

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

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

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


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

Неактивен

 

#42 27.04.2012 00:48:46

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

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

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


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

Неактивен

 

#43 27.04.2012 00:50:32

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

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

Можете привести простой пример из двух таблиц? С тестовыми данными - минимальный набор, лишь бы проблему увидеть.


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

Неактивен

 

#44 27.04.2012 01:45:22

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

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

TableA.id = "1"
TableA.name = "Магазин Ласточка"
TableA.adres = "Москва"

newsTableA.id = "1"
newsTableA.news = "Новость магазина Ласточка"
newsTableA.adres = "Москва"

В TableA.adres поменялось поле Москва на Махачкала.
а в newsTableA.adres - так и осталось Москва.

Видимо по задумке разработчика, это поле тоже должно обновляться, но не обновляется.
Для верности данных, при объединении его по логике видимо нужно убрать, но чтобы не было конфликта с возможными обновлениями, и не нарушалась работа сайта, я решил сделать выборку и объединить все поля newsTableA, но убрать из него поле newsTableA.adres, и подставить вместо него поле TableA.adres через join. Соответственно, таких таблиц, навроде newsTableA в скрипте довольно много.


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

Неактивен

 

#45 27.04.2012 01:58:25

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

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

"Интересная" структура БД... А не лучше ли поле newsTableA.adres сделать ссылкой на TableA.adres? Тогда такие неудачные ошибки в принципе не смогут появиться.

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

Ну а если и обновлять не получается (что очень плохо, если так) - то тогда Вам остаётся выбирать лишь нужные поля.


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

Неактивен

 

#46 27.04.2012 02:39:13

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

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

Подскажите, а что значит сделать ссылкой?


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

Неактивен

 

#47 27.04.2012 08:55:44

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

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

Ссылкой - имелось в виду вторичным ключом. Почитайте, например, http://webew.ru/posts/219.webew.


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

Неактивен

 

#48 27.04.2012 13:38:50

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

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

Спасибо большое за предоставленный материал. Очень интересное решение. Даже и не знал, что такое существует. Не уверен, что успею реализовать что-то подобное в этот раз, тк нужно еще попровать и поработать с подобного рода конструкцией, но возможно, поправлю потом, если быстро не разберусь. Все-таки очень полезный здесь форум. Я впервые регистрируюсь на форуме, обычно читаю, больше в области php и javascript, и надо признать, что данный форум приятно удивил.


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

Неактивен

 

#49 27.04.2012 17:47:05

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

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

Возник еще один вопрос. Подскажите, пожалуйста.
Никак не пойму работу функции group by.
Описанный deadka пример с суммированием значений визуально кажется понятным, но учитывая, что в работе у меня таких таблиц нет, уверенности, конечно в этом нет.

Я сделал следующую выборку.

TableA.id = 2, TableA.adres = "Москва", TableA.name="Ласточка-Москва"
TableB.id = 2, TableB.adres = "Владивосток",  TableB.name2="Ласточка-Владивосток"

SELECT * FROM(
SELECT
A.id, A.name,  A.adres, AA.mail
FROM TableA as A LEFT JOIN TableA AA ON A.id = AA.id
UNION ALL
SELECT
B.id, B.name2,  B.adres,  AA.mail
FROM TableB as B LEFT JOIN TableA as AA ON B.id= AA.id) as tableAlias


Ищу

having id='1' and adres='Владивосток'

Выдает id=1, adres=Владивосток, name=Ласточка-Владивосток

При поиске
having id='1' and adres='Москва' ничего не выдает.

Но стоило добавить
group by
т.е.
SELECT * FROM(
SELECT
A.id, A.name,  A.adres, AA.mail
FROM TableA as A LEFT JOIN TableA AA ON A.id = AA.id  group by A.selector
UNION ALL
SELECT
B.id, B.name2,  B.adres,  AA.mail
FROM TableB as B LEFT JOIN TableA as AA ON B.id= AA.id group by B.selector) as tableAlias


все ищется как положено.

Подскажите, пожалуйста, что же в данном случае делает group by? В чем его роль?

Отредактированно platedz (27.04.2012 17:48:45)


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

Неактивен

 

#50 27.04.2012 17:56:15

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

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

having используется после группировки. Его отличие от WHERE в том, что WHERE срабатывает до группировки, а having после, то есть в условии having можно учесть значения полей, которые получились рассчитаны в ходе группировки.


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

Неактивен

 

Board footer

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