SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 08.04.2008 22:49:25

Bombazook
Участник
Зарегистрирован: 08.04.2008
Сообщений: 1

Агрегаты для двух столбцов разных таблиц.

Есть 2 таблицы
В таблице 1 - (id, title, val)
и
В таблице 2 - (id, val)

Как сделать INNER JOIN по ID, оставив в результате только минимальное значение val.

Из
(
1 "А" 50
2 "B" 70
1 "C" 60
)

и
(
2 30
1 100
)

нужно получить
(
1 "A" 50
2 "B" 30
1 "C" 60
)

min(Table1.val, Table2.val) нельзя ведь писать? МУСКЛ ругается на неиспользование GROUP BY.


Реально запрос должен выглядеть как что-то вроде этого. Надеюсь, можно понять, что я хочу получить (средний уровень схожести каждого с каждым элементов двух таблиц песен по полю val):

   SELECT id, AVG(Conformity), title, genre_id
        FROM
        (
                SELECT  alias1.id, alias1.title, alias1.extraname, alias1.genre_id, MIN(alias1.val, alias2.val) as Conformity
                FROM
                (
                        SELECT songs.id, genre_id, val as val1, songs.title, artists.extraname
                        FROM songs, songs_genres, artists_songs, artists
                        WHERE artist_id = artists.id AND songs.id = artists_songs.song_id AND songs.id = songs_genres.song_id
                )as alias1
                INNER JOIN
                (
                        SELECT genre_id, val as val2
                        FROM songs, songs_genres, artists_songs, artists
                        WHERE (artists.extraname = 'Malstream' OR artists.name = 'Malstream') AND songs.title = '5:30' AND
                                     artist_id = artists.id AND songs.id = artists_songs.song_id AND songs.id = songs_genres.song_id
                ) as alias2
                ON alias1.genre_id = alias2.genre_id
        ) as alias3
        GROUP BY id
        HAVING AVG(conformity)>=10;


Может то же можно сделать проще?

Отредактированно Bombazook (08.04.2008 22:50:45)

Неактивен

 

#2 09.04.2008 00:29:41

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

Re: Агрегаты для двух столбцов разных таблиц.

Надо просто использовать другую конструкцию. Например, IF:
SELECT a.id, a.title, IF(a.val < b.val, a.val, b.val) AS val FROM a JOIN b USING(id);

Неактивен

 

Board footer

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