Задавайте вопросы, мы ответим
Вы не зашли.
Нужно примерно следующее. Есть две таблицы.
filial - филиалы и otdel - отделения. Нужно вывести все филиалы паралельно объединить их с отделениями.
Делаю так
Неактивен
right join заменить на left join ?
Неактивен
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)
Неактивен
group_concat на concat замените ещё.
Неактивен
vasya написал:
group_concat на concat замените ещё.
Все бы хорошо, но поля с филиалами и отделениями дублируются по количеству отделений. А мне нужны чтобы филиалы были оригинальными, а отделение было как бы в одной строке с филиалами.
Вариант с group_concat почти идеален, только выводит не все, у меня скажем 10 филиалов, и в одно 6 отделений. Мне нужно вывести 10 филиалов, и все 6 отделений занести в oname занести, чтобы потом через поиск посмотреть все совпадения через лайк и вывести только один филиал, а не по количеству отделений.
Отредактированно platedz (27.03.2012 15:50:29)
Неактивен
Приведите тестовые данные
show create table `имя таблицы`
insert into `имя таблицы` values(),(),() -- строк на 10
и желаемый результат
Неактивен
Таблица с филиалами
Отредактированно platedz (27.03.2012 16:07:14)
Неактивен
Неактивен
Извините, если я чего-то не понял, уже голова не соображает, т.к. сижу уже со вчерашнего вечера, результата добился небольшого, но зато узнал много нового.
Вот точный код запроса
Отредактированно platedz (27.03.2012 17:16:43)
Неактивен
См мой прошлый ответ. В приведенном мной запросе порядок объединения таблиц другой, и группировка по полям таблицы филиалов.
Неактивен
Спасибо большое, все вышло.
На всякий случай код
Неактивен
А это разве не документация - http://dev.mysql.com/doc/refman/5.5/en/
Неактивен
Это конечно, документация, только с английским у меня проблема.
Да и по русски документация документации рознь.
Вообще раньше никогда не придавал такого значения mysql, в первую очередь потому, что считал, что в mysql достаточно сложно лавировать и объединять данные, поэтому привык больше работать с файлами в своих проектах. И как следствие с mysql работал очень мало те. обычно с простыми запросами. Хотелось бы почитать и иметь под рукой что-нибудь достаточно понятное с хорошими примерами.
Неактивен
Все бы здорово, но теперь никак не могу применить like к данному запросу, в именно к group_concat, с отсальными все нормально. Пробовал назначить группе алианс и искать совпадение в алиансе. Подскажите, пожалуйста, как теперь like примерить. Т.е. скажем мне нужно найти слово мебель в названии фирмы, описании, и в отделе, который получился в результате 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
Как бы не очень понятно в чем разница, и видимо само значение данной записи?
Если объясните, хотя бы в двух словах, буду крайне признателен.
Неактивен
as необязательное ключевое слово
having это условие where применяемое после группировки
Неактивен
Ясно. Спасибо. На всякий случай спрошу, хотя необходимости в данном коде скорее всего нет, возможно ли каким-либо образом делать выборку в таком запросе
Неактивен
Что-то я суть последнего вопроса не уловил.
Неактивен
Имеется ввиду сделать выборку после объединения таблиц с помощью UNION
Неактивен
select .. from (select .. union all select ..) t ..;
Неактивен
Спасибо. Получилось. Извините за навязчивость, но у меня еще один вопрос возник. Я попробовал изменить идентификаторы и отделения одного филиала, думаю, что на практике такое часто может понадобиться, т.ч. буду крайне признателен если подскажите ответ и на этот вопрос.
Получилось следующее
Отредактированно platedz (29.03.2012 00:26:50)
Неактивен
Описанная выше проблема решила в какой-то мере. Я заменил поля со * на конкрекретные названия полей, которые присутствуют в обоих таблицах навроде 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)
Неактивен
Спасибо большое за ответы. Вроде все вышло. Единственная просьба, не могли бы вы объяснить, как работает group by, сколько не читал про него, так и не понял конкретно, особенно в моем случае, при объединении 4 таблиц.
Неактивен
Количество таблиц не играет роли - все равно в итоге получается выборка строк, в которых имеется несколько полей.
Принцип работы 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;
Неактивен