Соедините две таблицы в MySQL, возвращая только одну строку из второй таблицы - PullRequest
9 голосов
/ 24 июня 2011

У меня есть две таблицы: галерея и картинки:

галерея

id           int (auto increment, primary key)
name         varchar

картинки

id           int (auto increment, primary key)
picture      varchar
gallery_id   int (foreign key)

Как объединить эти две таблицы, показывающие для каждой строки из левой таблицы (галереи) только первую строку из второй таблицы, не просматривая все строки из второй таблицы?Я использую MySQL.

Моя цель - создать страницу, содержащую список существующих галерей с изображением каждой галереи в виде ссылки на страницу сведений со всеми изображениями этой галереи.


Я искал этот вопрос на этом сайте, но подобные вопросы слишком сложны.Меня интересует только этот простой пример.

Ответы [ 2 ]

12 голосов
/ 24 июня 2011

EDITED

Очевидно, что группировка в базе данных MySQL поможет вам.

Столбцы базы данных main_id, sub_id, sub_main_id, sub_data

SELECT *
FROM tblmain
  inner join sub on sub.sub_main_id = main_id
group by main_id;

без группы у меня есть эти записи:

1, 1, 1, 'test 1'
1, 2, 1, 'test 2'
2, 3, 2, 'test 3'
3, 4, 3, 'test 4'
2, 5, 2, 'test 5'

после группировки я получаю такой результат:

1, 1, 1, 'test 1'
2, 3, 2, 'test 3'
3, 4, 3, 'test 4'
0 голосов
/ 27 июня 2011

Второй вариант (без группировки) заключается в использовании внутренней нумерации строк и ограничении номера строки первым вхождением.

<code>set @gallery_id = '';
set @num  = 1;</p>

<p>SELECT *
FROM gallery
    INNER JOIN (
        select id, picture, gallery_id
        from (
            select
                id, 
                picture, 
                gallery_id,
                @num := if(@gallery_id = gallery_id, @num + 1, 1) as row_number,
                @gallery_id := gallery_id as dummy
            from pictures
        ) as pictureRows
        where pictureRows.row_number = 1
    ) as firstPicture ON firstPicture.gallery_id = gallery.id;

Надеюсь, это поможет вам

...