Задавайте вопросы, мы ответим
Вы не зашли.
Спасибо большое за ответ, но - это вроде более или менее ясно. Но у меня все поля текстовые по большому счету, и объединение происходить именно при слиянии тектовых полей, также применение алинсов тоже не до конца ясно. Очень надеюсь, что объясните, т.к. без понимания основы использовать и применять те или иные конструкции не очень удобно. Т.к. главное для меня все-таки не столь решение проблемы, а ее понимание.
Отредактированно platedz (18.04.2012 22:17:28)
Неактивен
Насколько я понял первые два вопроса причина в UNION. Хотя сам вопрос с алиансами остался несовсем ясным, но по крайней мере то как правильно манипулировать с данными через юнион я вроде разобрался.
Неясным остался лишь вопрос, почему при таком синтаксите
Неактивен
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 таблицу (ссылку не дам).
Неактивен
Данная выборка вернет вам столбец alians.name
Кроме как по этому имени к нему уже никак обратиться не получиться. Или вы что-то другое подразумеваете под "Выбрать данные по названию таблиц через алианс"?
Спасибо, но я имел ввиду, что я не смог сделать выборку указав непосредственно поле alians.name. Правда я пытался вернуть только одно поле, а в сгруппированном запросе их значительно больше.
С помощью join можно объединить 61 таблицу (ссылку не дам).
Я пытался объединить всего три таблицы, в том числе и с самой собой.
т.е.
Неактивен
А какая у Вас версия MySQL? я легко объединил 200-колоночные таблички в 5.5...
Неактивен
Проблема с колонками оказалась моя вина, т.к. я дважды занес названия колонок в массив. Извините за беспокойство.
Тем не менее остался неясным вопрос с выборкой через алиансы. Функция mysql_fetch_field() показала, что таблица действительно называется именем алианса, но выбрать обращением alians.id из такого сгруппированного запроса данные я не могу. Зато получилось выбрать все при указании каждого поля в отдельности. Насколько я понял, из любого сгруппированного запроса выбрать можно только все сгруппированные поля. Правильно ли я понял?
Неактивен
Теперь вроде и вовсе во всем разобрался. Я хотел добавить таблицу, но только после того, как получу из нее данные. Со звездочкой было намного удобнее, чем с созданием массива всех необходимых полей. Проблему решил tableA.*, tableB.id.
Тем не менее остался один последний вопрос. Помогите, пожалуйста, решить его. При группировке через group_concat, данные сливаются в одну строку. Поля я могу разделить при необходимости через парамент SEPARATOR, а могу ли я разделить колонки каким либо образом. Т.е. также как это делает CONCAT_WS, но внутри group_concat
Неактивен
А каким образом CONCAT_WS разделяет колонки? Что я не пойму о чем идет речь. Пример приведите.
Неактивен
Запрос с CONCAT_WS
Неактивен
select group_concat(CONCAT_WS("::", fil.id, fil.name,fil.adres) SEPARATOR ' || ') ...
Неактивен
Спасибо, огромное. Вышло. Даже и не знал, что так можно. Все-таки чего-то я наверное недопонимаю в mysql. Еще раз большое спасибо.
Неактивен
Подскажите, пожалуйста, а возможно ли выбрать все колонки кроме определенных. Т.е. скажем у меня в базе 3 колонки, table.id, table.name, table.adres, мне нужно выбрать все, кроме table.adres. Что-то навроде
select table.* кроме table.adres
Возможно ли записать как-то это "кроме" в Mysql запросе?
Отредактированно platedz (26.04.2012 20:24:44)
Неактивен
Подскажите, хотя бы возможно ли такое или нет. Т.к. нигде никакой информации о том, что в mysql существует возможность подобного рода запроса я не нашел. На данный момент приходится выбирать список колонок в таблице и исключать один ненужный. Просто учитывая, что делаю универсальное решение, то по другому не получается.
Неактивен
Такое ощущение, что нет. Разве что дико извращаться - лезть в information schema, формировать запрос динамически и. т. д. В чем проблема перечислить все нужные столбцы?
Неактивен
Особой проблемы нет, но было бы значительно удобнее если бы можно было выбрать все кроме одной. Просто уже не в первый раз встречаюсь с подобной необходимость, а в этот раз и таблиц еще надо перечислить несколько. Думал, что если что-то подобное существуют, то подскажет кто-нибудь. Люди здесь более знающие и опытные чем я. Да и знания никогда лишними не бывают. В любом случае, большое спасибо за ответ. Буду считать, что такой возможности нет, раз ни в поисковике, ни в документации, не нашел ничего, ни здесь.
Неактивен
platefz, к выбору колонок рекомендуется подходить аккуратно - в смысле что не выбирать лишних данных. Особенно это касается запросов, где Вы тащите данные из нескольких таблиц. Так что лучше честно перечисляйте нужные столбцы, попутно задаваясь вопросом на каждый из них - а нужен ли он в выборке.
Неактивен
Я понимаю, но на данный момент выводятся все поля участвуют в коде. Только в каждой таблице было изначально создана одна колонка, которое по задумке автора, видимо должна еще и обновляться, но не обновляется. И его необходимо подменить на поле из другой колонке для верности вывода данных.
Неактивен
Можете привести простой пример из двух таблиц? С тестовыми данными - минимальный набор, лишь бы проблему увидеть.
Неактивен
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 в скрипте довольно много.
Неактивен
"Интересная" структура БД... А не лучше ли поле newsTableA.adres сделать ссылкой на TableA.adres? Тогда такие неудачные ошибки в принципе не смогут появиться.
Но если структуру менять нельзя, то поле действительно должно обновляться - иначе данные рассогласованные получаются.
Ну а если и обновлять не получается (что очень плохо, если так) - то тогда Вам остаётся выбирать лишь нужные поля.
Неактивен
Подскажите, а что значит сделать ссылкой?
Неактивен
Ссылкой - имелось в виду вторичным ключом. Почитайте, например, http://webew.ru/posts/219.webew.
Неактивен
Спасибо большое за предоставленный материал. Очень интересное решение. Даже и не знал, что такое существует. Не уверен, что успею реализовать что-то подобное в этот раз, тк нужно еще попровать и поработать с подобного рода конструкцией, но возможно, поправлю потом, если быстро не разберусь. Все-таки очень полезный здесь форум. Я впервые регистрируюсь на форуме, обычно читаю, больше в области php и javascript, и надо признать, что данный форум приятно удивил.
Неактивен
Возник еще один вопрос. Подскажите, пожалуйста.
Никак не пойму работу функции group by.
Описанный deadka пример с суммированием значений визуально кажется понятным, но учитывая, что в работе у меня таких таблиц нет, уверенности, конечно в этом нет.
Я сделал следующую выборку.
TableA.id = 2, TableA.adres = "Москва", TableA.name="Ласточка-Москва"
TableB.id = 2, TableB.adres = "Владивосток", TableB.name2="Ласточка-Владивосток"
Отредактированно platedz (27.04.2012 17:48:45)
Неактивен
having используется после группировки. Его отличие от WHERE в том, что WHERE срабатывает до группировки, а having после, то есть в условии having можно учесть значения полей, которые получились рассчитаны в ходе группировки.
Неактивен