ФорумРазработкаБазы данных → JOIN и GROUP

JOIN и GROUP

  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 30 марта 2009 г. 10:08

    Есть таблицы photos и albums. Нужно выбрать список альбомов и + по одной фотографии для каждого (любая случайная фотка). Ничего умнее чем группировать по album_id не придумал:
    SELECT * FROM albums
    LEFT JOIN photos ON (albums.album_id=photos.photo_id)
    GROUP BY albums.album_id

    Получается, что сначала будут выбраны все записи из photos, сделается join с albums, потом сгруппируются. Громоздко как-то.
    Ещё можно, конечно, добавить в albums поле, типа main_photo_id и держать там значение фотки. Просто может есть проще вариант?
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 10:14, спустя 6 минут 28 секунд

    LEFT JOIN
    все умрут, а я изумруд
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 10:17, спустя 2 минуты 22 секунды

    Timur, дай примерную структуру, а лучше дамп
    adw/0
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 30 марта 2009 г. 10:20, спустя 3 минуты 31 секунду


    LEFT JOIN
    ?


    Timur, дай примерную структуру, а лучше дамп

    убрал всё лишнее
    CREATE TABLE albums (
    album_id mediumint(9) NOT NULL auto_increment,
    `name` varchar(255) NOT NULL,
    PRIMARY KEY (album_id)
    ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COMMENT='Фотоальбомы' AUTO_INCREMENT=5 ;

    CREATE TABLE photos (
    photo_id int(11) NOT NULL auto_increment,
    album_id mediumint(9) default NULL,
    description varchar(255) NOT NULL,
    PRIMARY KEY (photo_id),
    KEY album_id (album_id)
    ) ENGINE=MyISAM AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 COMMENT='Фотографии' AUTO_INCREMENT=26 ;
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 10:26, спустя 5 минут 12 секунд

    я б сливал альбомы с РАНДОМНО отсортированными КАРТИНКАМИ, с ДИСТИНКТОМ ПО АЛЬБУМ АЙДИ - будет мгновенно на любой бд при проставленых индексах :)
    Сапожник без сапог
  • md5

    Сообщения: 11949 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 10:34, спустя 8 минут 48 секунд



    LEFT JOIN
    ?
    тупанул, пардон
    все умрут, а я изумруд
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 30 марта 2009 г. 10:39, спустя 4 минуты 56 секунд

    я наверное туплю как всегда, но не догоняю
    SELECT DISTINCT album_id, photo_id FROM photos
    - DISTINCT сработает по обоим полям и album_id будут повторяться (т.е. он все записи выберет)
    SELECT DISTINCT album_id FROM photos
    - я не получу ID фоток

    Видимо тут без группировки никак.
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 11:00, спустя 21 минуту 1 секунду

    тупишь как всегда
    Сапожник без сапог
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 30 марта 2009 г. 14:56, спустя 3 часа 56 минут

    Продолжаю тупить. Ситуация — когда просматриваем фотографию, нужны ссылки на ещё две — предыдущую и следующую. Фотографии отсортированы по дате загрузки и раскиданы по альбомам. Таблица

    • photo_id - ID фотки

    • album_id - ID альбома

    • loaddate - время загруки (int)


    У меня получилось только через 3 запроса, причем два из них че-то совсем не нравятся. Что посоветуете, кроме как убиться апстену?
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 14:59, спустя 2 минуты 29 секунд

    можно в юнион селект завернуть чтобы было одним запросом - сократить время парсинга и сетевого конекта. по теме - я хз как делают по хорошему до и после фотографии, никогда не задумывался такими задачами … только в 2 селекта в голоу приходт, ил как я сказал - селект + юнион селект
    Сапожник без сапог
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 30 марта 2009 г. 15:04, спустя 5 минут 20 секунд

    с юнионом я кстати так и сделал, получилась вот такая хня:

    $sql = 'SELECT MAX(photo_id) AS photo_id FROM photos ' .
          "WHERE album_id=$album_id AND loaddate<$loaddate " .
          'UNION ' .
          'SELECT MIN(photo_id) AS photo_id FROM photos ' .
          "WHERE album_id=$album_id AND loaddate>$loaddate";


    неохота 2 раза прогонять всю таблицу, чтоб выбрать 2 значения
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 15:06, спустя 1 минуту 56 секунд

    ахуеть ты жжешь.

    select * From photos where alubumid = 10 and time < $time order BY time DESC LIMIT 1.

    и не надо прогонять всю таблицу. если индексы расставишь, то это запрос за 0
    Сапожник без сапог
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 30 марта 2009 г. 15:14, спустя 8 минут 19 секунд

    пробовал так сначала, но выдает:
    #1221 - Incorrect usage of UNION and ORDER BY
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 30 марта 2009 г. 15:16, спустя 1 минуту 16 секунд

    а епт.. опять ступил…
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 30 марта 2009 г. 15:16, спустя 6 секунд

    эмм …. ну попробуй проджойнить или тп.. у тебя с скл слабо ага? просто чувствуется :(
    Сапожник без сапог

Пожалуйста, авторизуйтесь, чтобы написать комментарий!