Ответы пользователя по тегу MySQL
  • MySQL or PHP? Сложный запрос

    alexdob
    @alexdob
    SELECT
     t1.link,
     t1.name,
     t1.txt,
     if(t1.txt REGEXP "^<a(.*)><img(.*)/></a>$",
      REPLACE(t1.txt, 'alt=""', CONCAT('alt="', (SELECT name FROM test_toster_102543 WHERE link=t1.link),'"')),
      REPLACE(t1.txt, 'alt=""', CONCAT('alt="', t1.name,'"'))
     ) as txt_rgexp
    FROM
     test_toster_102543 t1
    Ответ написан
    Комментировать
  • Как правильно хранить ссылки на музыку в БД MySQL?

    alexdob
    @alexdob
    В случае, если один трек принадлежит только одному альбому - хватит двух таблиц и связи один ко многим.
    CREATE TABLE `m_albums` (
    	`album_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    	`album_name` VARCHAR(50) NOT NULL DEFAULT 'album No name',
    	PRIMARY KEY (`album_id`)
    )
    ENGINE=InnoDB;
    CREATE TABLE `m_tracks` (
    	`track_id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    	`track_name` VARCHAR(50) NULL DEFAULT 'track No name',
    	`album_id` INT(10) UNSIGNED NOT NULL,
    	PRIMARY KEY (`track_id`),
    	INDEX `album_id` (`album_id`)
    )
    ENGINE=InnoDB;


    Выбор треков из определенного альбома c ID = 1:
    SELECT
    	mt.track_id, mt.track_name
    FROM
    	m_tracks mt, m_albums ma
    WHERE
    	mt.album_id = ma.album_id AND ma.album_id = 1

    Если трек может повторяться в нескольких альбомах, то будет связь многие-ко-многим и таблиц будет три:
    ALTER TABLE m_tracks DROP COLUMN album_id;
    CREATE TABLE `m_ref_album_tracks` (
    	`album_id` INT(10) UNSIGNED NOT NULL,
    	`track_id` INT(10) UNSIGNED NOT NULL,
    	INDEX `album_id` (`album_id`),
    	INDEX `track_id` (`track_id`)
    )
    COLLATE='utf8_general_ci'
    ENGINE=InnoDB;

    хотя можно было бы использовать и составной индекс. и выборка:
    SELECT
    	mt.track_id, mt.track_name
    FROM
    	m_albums ma, m_tracks mt, m_ref_album_tracks rat
    WHERE
    	rat.album_id = 1 AND rat.album_id = ma.album_id AND rat.track_id = mt.track_id

    как-то так (или можно JOIN`ом, кому как нравится). Или смотрим в каких альбомах есть определенный трек:
    SELECT
    	ma.album_id, ma.album_name
    FROM
    	m_albums ma, m_tracks mt, m_ref_album_tracks rat
    WHERE
    	rat.track_id = 2 AND rat.album_id = ma.album_id AND rat.track_id = mt.track_id

    на хабре уже описывали эти связи, например, здесь habrahabr.ru/post/193380
    Говоря про движок таблиц InnoDB можно использовать еще и внешние ключи, но это немного другая история..
    Ответ написан
    Комментировать