Всем привет!
У меня есть два похожих запроса, они имеют такой вид:
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, но как потом полученные строки объединить с результатми выполнения первого запроса?
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???? Если да, то месье знает толк в извращениях
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-х запросов, интересует объединение построчно. На что поглядеть в документации?
N>Нет, это разные колонки с разными значениями, такие имена у них тут, запросы я привёл с сокращениями. Меня интересует вопрос — можно ли сконкатенировать результаты выполнения 2-х запросов, интересует объединение построчно. На что поглядеть в документации?
Поглядеть что — как соединить результаты выполнения двух неправильных запросов?
примерно так
select
*
from
(
первый неправильный запрос
) q1
full outer join (
второй неправильный запрос
) q2 on q1.id = q2.id
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
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?
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. Или я перевожу неправильно?
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 из связанных с данным юзером. То, что в одном запросе на своей машине ты получаешь именно ту, которая тебе нужна, не значит что в другой раз на другом сервере на другом наборе данных ты получишь тоже самое.
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
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
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>