Объединение запросов
От: Nameless  
Дата: 24.02.11 09:15
Оценка:
Всем привет!
У меня есть два похожих запроса, они имеют такой вид:

SELECT su.id, u.a, u.b, GROUP_CONCAT(g.name) AS names FROM Table1 su, Table2 u, Table3 g 
WHERE su.id=u.id AND su.g_id=g.g_id AND su.name='SOMENAME' GROUP BY u.a ORDER BY u.id

SELECT su.id, g.name FROM Table1 su, Table2 u, Table3 g 
WHERE su.id=u.id AND u.gid=g.gid AND su.name='SOMENAME' GROUP BY u.a ORDER BY su.id


Подскажите, пожалуйста, можно ли выполнить объединение этих запросов и каким образом? Если в первый запрос добавить условие
AND u.gid=g.gid
и указать вибирать g.name, то запрос возвращает не то, что нужно, т.к. для этого столбца возвращается несколько значений, которые потом конкатенируются через запятую. Второй завпрос возвращает правильное значение для g.name, но как потом полученные строки объединить с результатми выполнения первого запроса?

P.S. Сервер БД — mysql 5.0.77.

Спасибо.
--
Alexander
Re: Объединение запросов
От: avpavlov  
Дата: 24.02.11 11:15
Оценка:
N>
N>SELECT su.id, g.name FROM Table1 su, Table2 u, Table3 g 
N>WHERE su.id=u.id AND u.gid=g.gid AND su.name='SOMENAME' GROUP BY u.a ORDER BY su.id
N>


N>Подскажите, пожалуйста, можно ли выполнить объединение этих запросов и каким образом? Если в первый запрос добавить условие
AND u.gid=g.gid
и указать вибирать g.name, то запрос возвращает не то, что нужно, т.к. для этого столбца возвращается несколько значений, которые потом конкатенируются через запятую. Второй завпрос возвращает правильное значение для g.name, но как потом полученные строки объединить с результатми выполнения первого запроса?


N>P.S. Сервер БД — mysql 5.0.77.


Коллега, второй запрос возвращает вовсе не "правильное значение для g.name", а случайное значение из доступных в пределах группировки по u.a. То что оно тебе подходит, не делает его правильным, потому что нет гарантий воспроизводимости этой случайности в дальнейшем.

Ещё мне понравилось "su.g_id=g.g_id" и "u.gid=g.gid". У тебя в таблице g две колонки g_id и gid???? Если да, то месье знает толк в извращениях

П.С. МайСКЛ (любой версии) — отстой
Re[2]: Объединение запросов
От: Nameless  
Дата: 24.02.11 12:21
Оценка:
Здравствуйте, avpavlov, Вы писали:

N>>
N>>SELECT su.id, g.name FROM Table1 su, Table2 u, Table3 g 
N>>WHERE su.id=u.id AND u.gid=g.gid AND su.name='SOMENAME' GROUP BY u.a ORDER BY su.id
N>>


N>>Подскажите, пожалуйста, можно ли выполнить объединение этих запросов и каким образом? Если в первый запрос добавить условие
AND u.gid=g.gid
и указать вибирать g.name, то запрос возвращает не то, что нужно, т.к. для этого столбца возвращается несколько значений, которые потом конкатенируются через запятую. Второй завпрос возвращает правильное значение для g.name, но как потом полученные строки объединить с результатми выполнения первого запроса?


N>>P.S. Сервер БД — mysql 5.0.77.


A>Коллега, второй запрос возвращает вовсе не "правильное значение для g.name", а случайное значение из доступных в пределах группировки по u.a. То что оно тебе подходит, не делает его правильным, потому что нет гарантий воспроизводимости этой случайности в дальнейшем.


A>Ещё мне понравилось "su.g_id=g.g_id" и "u.gid=g.gid". У тебя в таблице g две колонки g_id и gid???? Если да, то месье знает толк в извращениях


Нет, это разные колонки с разными значениями, такие имена у них тут, запросы я привёл с сокращениями. Меня интересует вопрос — можно ли сконкатенировать результаты выполнения 2-х запросов, интересует объединение построчно. На что поглядеть в документации?
--
Alexander
Re[3]: Объединение запросов
От: avpavlov  
Дата: 24.02.11 13:14
Оценка: 3 (1)
N>Нет, это разные колонки с разными значениями, такие имена у них тут, запросы я привёл с сокращениями. Меня интересует вопрос — можно ли сконкатенировать результаты выполнения 2-х запросов, интересует объединение построчно. На что поглядеть в документации?

Поглядеть что — как соединить результаты выполнения двух неправильных запросов?

примерно так

select
 *
from
 ( 
   первый неправильный запрос
 ) q1
 full outer join ( 
   второй неправильный запрос
 ) q2 on q1.id = q2.id
Re[4]: Объединение запросов
От: Nameless  
Дата: 24.02.11 17:13
Оценка:
Здравствуйте, avpavlov, Вы писали:

A>Поглядеть что — как соединить результаты выполнения двух неправильных запросов?


A>примерно так


A>
A>select
A> *
A>from
A> ( 
A>   первый неправильный запрос
A> ) q1
A> full outer join ( 
A>   второй неправильный запрос
A> ) q2 on q1.id = q2.id
A>


Большое спасибо, это именно то, что мне требовалось.
--
Alexander
Re[5]: Объединение запросов
От: avpavlov  
Дата: 24.02.11 19:16
Оценка:
N>Большое спасибо, это именно то, что мне требовалось.

Это не то, что тебе требовалось. Тебе требуется из неправильных запросов сделать правильные.
Re: Объединение запросов
От: Смоляное Чучелко Россия  
Дата: 25.02.11 01:25
Оценка:
N>
N>SELECT su.id, u.a, u.b, GROUP_CONCAT(g.name) AS names FROM Table1 su, Table2 u, Table3 g 
N>WHERE su.id=u.id AND su.g_id=g.g_id AND su.name='SOMENAME' GROUP BY u.a ORDER BY u.id 
N>

N>
N>SELECT su.id, g.name FROM Table1 su, Table2 u, Table3 g 
N>WHERE su.id=u.id AND u.gid=g.gid AND su.name='SOMENAME' GROUP BY u.a ORDER BY su.id
N>


N>Подскажите, пожалуйста, можно ли выполнить объединение этих запросов и каким образом?


То бишь, g_id и gid -- не описка, и в двух запросах записи из su соответствуют разные записи из g?

Тогда во from Table3 g1, Table3 g2 c соответствующей правкой select и where
Re[2]: Объединение запросов
От: Смоляное Чучелко Россия  
Дата: 25.02.11 01:49
Оценка:
N>>
N>>SELECT su.id, u.a, u.b, GROUP_CONCAT(g.name) AS names FROM Table1 su, Table2 u, Table3 g 
N>>WHERE su.id=u.id AND su.g_id=g.g_id AND su.name='SOMENAME' GROUP BY u.a ORDER BY u.id 
N>>


Кстати, а ведь и правда не заметил. В selectе с group by должны использоваться либо гшруппируемые поля, либо агрегатные функи от негруппируемых. Эти два запроса действительно работают? И что возвращается в su.id, u.b?
Re[3]: Объединение запросов
От: Nameless  
Дата: 25.02.11 07:22
Оценка:
Здравствуйте, Смоляное Чучелко, Вы писали:


N>>>
N>>>SELECT su.id, u.a, u.b, GROUP_CONCAT(g.name) AS names FROM Table1 su, Table2 u, Table3 g 
N>>>WHERE su.id=u.id AND su.g_id=g.g_id AND su.name='SOMENAME' GROUP BY u.a ORDER BY u.id 
N>>>


СЧ>Кстати, а ведь и правда не заметил. В selectе с group by должны использоваться либо гшруппируемые поля, либо агрегатные функи от негруппируемых. Эти два запроса действительно работают? И что возвращается в su.id, u.b?


Как написано в документации по Mysql — http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html БД разрешает использовать GROUP BY с неагрегированными столбцами, или вычисления в списке выборки, которые не используются в GROUP BY. Или я перевожу неправильно?
--
Alexander
Re[4]: Объединение запросов
От: avpavlov  
Дата: 25.02.11 07:46
Оценка:
N>Как написано в документации по Mysql — http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html БД разрешает использовать GROUP BY с неагрегированными столбцами, или вычисления в списке выборки, которые не используются в GROUP BY. Или я перевожу неправильно?

Ты переводишь правильно, но не всё

The server is free to return any value from the group, so the results are indeterminate unless all values are the same.


Если у тебя u (юзер?) может быть больше чем в одной g (группе?) и они связаны через su (многие-ко-многим), то сервер будет возвращать тебе случайную g.name из связанных с данным юзером. То, что в одном запросе на своей машине ты получаешь именно ту, которая тебе нужна, не значит что в другой раз на другом сервере на другом наборе данных ты получишь тоже самое.
Re[5]: Объединение запросов
От: Nameless  
Дата: 25.02.11 08:58
Оценка:
Здравствуйте, avpavlov, Вы писали:


N>>Как написано в документации по Mysql — http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html БД разрешает использовать GROUP BY с неагрегированными столбцами, или вычисления в списке выборки, которые не используются в GROUP BY. Или я перевожу неправильно?


A>Ты переводишь правильно, но не всё


A>

A>The server is free to return any value from the group, so the results are indeterminate unless all values are the same.


A>Если у тебя u (юзер?) может быть больше чем в одной g (группе?) и они связаны через su (многие-ко-многим), то сервер будет возвращать тебе случайную g.name из связанных с данным юзером. То, что в одном запросе на своей машине ты получаешь именно ту, которая тебе нужна, не значит что в другой раз на другом сервере на другом наборе данных ты получишь тоже самое.


Да, у пользователя есть всегда определённая первичная группа, но на разных серверах он может иметь различный набор вторичных групп. Первый запрос возвращает gid первичной группы и перечисление через запятую вторичных. Второй запрос для gid пользователя возвращает её имя. Во втором запросе я ошибся(переделывал его из первого), группировать надо по полю su.id.

SELECT su.id, g.name FROM Table1 su, Table2 u, Table3 g 
WHERE su.id=u.id AND u.gid=g.gid AND su.name='SOMENAME' GROUP BY su.id ORDER BY su.id
--
Alexander
Re[6]: Объединение запросов
От: avpavlov  
Дата: 25.02.11 09:53
Оценка: 3 (1)
N>Да, у пользователя есть всегда определённая первичная группа, но на разных серверах он может иметь различный набор вторичных групп. Первый запрос возвращает gid первичной группы и перечисление через запятую вторичных. Второй запрос для gid пользователя возвращает её имя. Во втором запросе я ошибся(переделывал его из первого), группировать надо по полю su.id.


SELECT 
  u.id, u.a, u.b
  , (select name from Table3 pg on u.gid=pg.gid) primary_group_name
  ,GROUP_CONCAT(g.name) AS secondary_group_names 
FROM 
  Table2 u
  left join Table1 su on su.id=u.id 
  left join Table3 g on su.g_id=g.g_id 
WHERE  
  su.name='SOMENAME' 
group by
  u.id
  ,u.a -- вот это МайСКЛ позволяет не делать, но я рекомендую тебе не пользоваться такими хаками
  ,u.b -- вот это МайСКЛ позволяет не делать, но я рекомендую тебе не пользоваться такими хаками 
ORDER BY 
  u.id
Re[7]: Объединение запросов
От: Nameless  
Дата: 28.02.11 11:10
Оценка:
Здравствуйте, avpavlov, Вы писали:


N>>Да, у пользователя есть всегда определённая первичная группа, но на разных серверах он может иметь различный набор вторичных групп. Первый запрос возвращает gid первичной группы и перечисление через запятую вторичных. Второй запрос для gid пользователя возвращает её имя. Во втором запросе я ошибся(переделывал его из первого), группировать надо по полю su.id.



A>
A>SELECT 
A>  u.id, u.a, u.b
A>  , (select name from Table3 pg on u.gid=pg.gid) primary_group_name
A>  ,GROUP_CONCAT(g.name) AS secondary_group_names 
A>FROM 
A>  Table2 u
A>  left join Table1 su on su.id=u.id 
A>  left join Table3 g on su.g_id=g.g_id 
A>WHERE  
A>  su.name='SOMENAME' 
A>group by
A>  u.id
A>  ,u.a -- вот это МайСКЛ позволяет не делать, но я рекомендую тебе не пользоваться такими хаками
A>  ,u.b -- вот это МайСКЛ позволяет не делать, но я рекомендую тебе не пользоваться такими хаками 
A>ORDER BY 
A>  u.id
A>


Спасибо, разобрался у себя и переделал.
--
Alexander
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.