Найти на форуме:
Loading




+ Ответить в теме
Страница 1 из 2 1 2 ПоследняяПоследняя
Показано с 1 по 10 из 14

Тема: Нужна помощь с формированием запроса к базе MySQL [РЕШЕНО]

  1. #1
    МегаМания admin MickyMaus Воплощение зла MickyMaus Воплощение зла Аватар для MickyMaus

    Регистрация
    14.07.2007
    Адрес
    Херсон
    Сообщений
    977
    Сказал(а) спасибо
    6
    Поблагодарили 23 раз(а) в 17 сообщениях

    По умолчанию Нужна помощь с формированием запроса к базе MySQL [РЕШЕНО]

    Знаю, что не рационально использовать запросы в цикле, но не могу придумать, как это еще сделать, так что прошу попощи спецов.
    вот код:
    PHP код:
    $query "SELECT DISTINCT playlist  FROM jos_musicbox_pls WHERE  userid=$userid";     
    $result mysql_query($query); // выборка уникальных плейлистов для каждого юзера 
    $i=1;

    while (
    $row mysql_fetch_assoc($result)) 
    {
    // формируем список песен в этих плейлистах
    echo "<playlist>";
    echo 
    "<id>".$i."</id>";
    echo 
    "<name>$row[playlist]</name>";

    [
    B]$query "SELECT * FROM jos_musicbox_pls WHERE  playlist='$row[playlist]'";[/B]

            
    $result1 mysql_query($query);
            while (
    $row1 mysql_fetch_assoc($result1)) 
            {
            echo 
    "<track_id>t_$row1[songid]</track_id>";
            }
            
    echo 
    "</playlist>";

    $i=$i+1;


    Сам со своим небольшим познанием в пхп вижу что этот кусок кода ну очень уж "некрасивый", у кого есть какие идеи по оптимизации, прошу высказаться.

  2. #2
    Старожил freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества

    Регистрация
    17.05.2007
    Сообщений
    888
    Сказал(а) спасибо
    8
    Поблагодарили 106 раз(а) в 30 сообщениях

    По умолчанию

    Мега супер индусский говнокод для выборки данных из одной таблицы в цикле )))

    Достаточно одной таблэтки:

    SELECT * FROM jos_musicbox_pls WHERE playlist IN
    (SELECT DISTINCT playlist FROM jos_musicbox_pls WHERE userid=$userid)

    Там точно работа идёт с одной и той же таблицей jos_musicbox_pls в обоих запросах? Ибо всё может быть ещё проще
    http://avtodrom.com.ua - мета-сайт поиска авто!

    Люди часто жалуются на нехватку денег, времени или сил, но почти никогда не жалуются на нехватку ума.

  3. #3
    МегаМания admin MickyMaus Воплощение зла MickyMaus Воплощение зла Аватар для MickyMaus

    Регистрация
    14.07.2007
    Адрес
    Херсон
    Сообщений
    977
    Сказал(а) спасибо
    6
    Поблагодарили 23 раз(а) в 17 сообщениях

    По умолчанию

    за код спасибо, еще читал дето про INNER join если разные таблицы

    Но в коде учитываются ид песни для текущего плейлиста

    PHP код:
    echo "<name>$row[playlist]</name>";

    $query "SELECT * FROM jos_musicbox_pls WHERE  playlist='$row[playlist]'";

            
    $result1 mysql_query($query);
            while (
    $row1 mysql_fetch_assoc($result1)) 
            {
            echo 
    "<track_id>t_$row1[songid]</track_id>";
            }
            
    echo 
    "</playlist>"
    Последний раз редактировалось MickyMaus; 24.11.2009 в 00:27.

  4. #4
    Завсегдатай xyzvital Странник

    Регистрация
    04.09.2009
    Сообщений
    127
    Сказал(а) спасибо
    39
    Поблагодарили 9 раз(а) в 7 сообщениях

    По умолчанию

    Что то мне подсказывает что то что должно храниться в двух таблицах, хранится в одной.
    Структуру таблицы в студию.

  5. #5
    МегаМания admin MickyMaus Воплощение зла MickyMaus Воплощение зла Аватар для MickyMaus

    Регистрация
    14.07.2007
    Адрес
    Херсон
    Сообщений
    977
    Сказал(а) спасибо
    6
    Поблагодарили 23 раз(а) в 17 сообщениях

    По умолчанию

    Цитата Сообщение от xyzvital Посмотреть сообщение
    Что то мне подсказывает что то что должно храниться в двух таблицах, хранится в одной.
    Структуру таблицы в студию.
    --
    -- Структура таблицы `jos_musicbox_pls`
    --

    Код:
    CREATE TABLE `jos_musicbox_pls` (
      `id` int(11) NOT NULL auto_increment,
      `songid` int(11) NOT NULL,
      `userid` int(11) NOT NULL,
      `playlist` varchar(255) NOT NULL default 'MY SONGS',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=679 ;
    
    --
    -- Структура таблицы `jos_musicbox_playlists`
    --

    Код:
    CREATE TABLE `jos_musicbox_playlists` (
      `userid` int(11) NOT NULL,
      `playlistname` text NOT NULL,
      KEY `idx_userid` (`userid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
    

  6. #6
    Завсегдатай xyzvital Странник

    Регистрация
    04.09.2009
    Сообщений
    127
    Сказал(а) спасибо
    39
    Поблагодарили 9 раз(а) в 7 сообщениях

    По умолчанию

    Вариант freeman делает то же что и твои запросы.
    Вообще связи не совсем понятны. Сначала выбираются плейлисты по юзеру, затем все по этим плейлистам (т.е. уже другие пользователи выбираются). Зачем?
    Я бы делал таблицы, например:

    idюзера - имя ....

    idюзера - idплейлиста

    idплейлиста - название плейлиста ...

    idпесни - название песни ...

    idплейлиста - idпесни (связь)

  7. #7
    Завсегдатай Wolfshadow Странник Аватар для Wolfshadow

    Регистрация
    28.06.2009
    Адрес
    Херсон
    Сообщений
    120
    Сказал(а) спасибо
    1
    Поблагодарили 17 раз(а) в 8 сообщениях

    По умолчанию

    Цитата Сообщение от MickyMaus Посмотреть сообщение
    --
    -- Структура таблицы `jos_musicbox_pls`
    --

    Код:
    CREATE TABLE `jos_musicbox_pls` (
      `id` int(11) NOT NULL auto_increment,
      `songid` int(11) NOT NULL,
      `userid` int(11) NOT NULL,
      `playlist` varchar(255) NOT NULL default 'MY SONGS',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=679 ;
    
    --
    -- Структура таблицы `jos_musicbox_playlists`
    --

    Код:
    CREATE TABLE `jos_musicbox_playlists` (
      `userid` int(11) NOT NULL,
      `playlistname` text NOT NULL,
      KEY `idx_userid` (`userid`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
    

    Во-первых: у тебя одна таблица или две?

    Во-вторых: опиши пожалуйста конкретнее, что надо сделать (выбрать все плейлисты текущего юзера, выбрать все песни этих листов и сгруппировать по листам?)

    Если я правильно понял то вот как все должно быть

    1.1. Если плейлист к песням один ко многим:

    Код:
    CREATE TABLE `playlists` (
      `id` int(11) NOT NULL auto_increment,
      `user_id` int(11) NOT NULL,
      `playlist_name` varchar(255) NOT NULL default 'MY SONGS',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;
    
    CREATE TABLE `tracks` (
      `id` int(11) NOT NULL auto_increment,
      `playlist_id` int(11) NOT NULL,
      `track_name` varchar(255) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;
    
    1.1. Если плейлист к песням многие ко многим (одна песня в несколько листов может входить):

    Код:
    CREATE TABLE `playlists` (
      `id` int(11) NOT NULL auto_increment,
      `user_id` int(11) NOT NULL,
      `playlist_name` varchar(255) NOT NULL default 'MY SONGS',
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;
    
    CREATE TABLE `tracks` (
      `id` int(11) NOT NULL auto_increment,
      `track_name` varchar(255) NOT NULL,
      PRIMARY KEY  (`id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;
    
    CREATE TABLE `tracks_playlists` (
      `track_id` int(11) NOT NULL,
      `playlist_id` int(11) NOT NULL,
      PRIMARY KEY  (`track_id`,`playlist_id`)
    ) ENGINE=MyISAM  DEFAULT CHARSET=cp1251;
    
    2.1. Код PHP для создания XML плейлистов юзера в первом случае:

    PHP код:
    $UID intval($user);

    $Query "SELECT p.id AS playlist_id, t.id AS track_id, playlist_name, track_name 
    FROM playlists p 
    LEFT JOIN tracks t ON p.id = t.playlist_id 
    WHERE p.user_id = 
    $UID";

    $Result mysql_query($Query);

    $Playlists = array();
    while(
    $Track mysql_fetch_assoc($Result))
    {
    $p $Track['playlist_id'];
    $t $Track['track_id'];
    if(!isset(
    $Playlists[$p])) $Playlists[$p] = array();
    $Playlists[$p][$t] = $Track;
    }

    // теперь $Playlists - структурированны двухмерный массив 
    // листов и треков для каждого листа. Запрос к базе был 1. 
    2.2. Тот же самый случай но второй вариант (многие ко многим)

    PHP код:
    $Query "SELECT p.id AS playlist_id, t.id AS track_id, playlist_name, track_name 
    FROM playlists p 
    INNER JOIN tracks_playlists pt ON pt.playlist_id = p.id
    INNER JOIN tracks t ON pt.track_id = t.id

    WHERE p.user_id = 
    $UID";

    // Все остальное в точности как в варианте 1 
    Linux, Apache, PHP, MySQL, Javascript, CSS, XHTML
    http://vkontakte.ru/id7182971

  8. #8
    Старожил freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества freeman Последняя надежда человечества

    Регистрация
    17.05.2007
    Сообщений
    888
    Сказал(а) спасибо
    8
    Поблагодарили 106 раз(а) в 30 сообщениях

    По умолчанию

    Цитата Сообщение от xyzvital Посмотреть сообщение
    Вариант freeman делает то же что и твои запросы.
    Да, зато избавляемся от цикла и от нагрузки на веб-сервер и базу данных. Что и требовалось.
    http://avtodrom.com.ua - мета-сайт поиска авто!

    Люди часто жалуются на нехватку денег, времени или сил, но почти никогда не жалуются на нехватку ума.

  9. #9
    МегаМания admin MickyMaus Воплощение зла MickyMaus Воплощение зла Аватар для MickyMaus

    Регистрация
    14.07.2007
    Адрес
    Херсон
    Сообщений
    977
    Сказал(а) спасибо
    6
    Поблагодарили 23 раз(а) в 17 сообщениях

    По умолчанию

    Создание нужных таблиц это дело хорошее, но в моем случае не подходит. Таблицы уже созданы и их изменение повлечет за собой лавину переделок по всему сайту.

    Таблица jos_musicbox_pls - храняться ид песен с ид юзера и именем плейлиста, в который входит песня.

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

    Соответственно, каждая песня может быть только в одном плейлисте.

    Наглядно можно посмотреть на МелоМании, добавив несколько песен в свой плейлист и запустив Мой плейлист.

    В плеере отображаются список плейлистов (выборка из jos_musicbox_playlists по ид юзера), при клике на который загружаются песни из него (выборка из jos_musicbox_pls по имени плейлиста и ид юзера.)

    В принципе запрос
    PHP код:
    $query "SELECT DISTINCT playlist  FROM jos_musicbox_pls WHERE  userid=$userid";     
    $result mysql_query($query); 
    можно сделать и из jos_musicbox_playlists

    PHP код:
    $query "SELECT playlistname  FROM jos_musicbox_playlists WHERE  userid=$userid";     
    $result mysql_query($query); 
    Получаем например 3 строки. Теперь нужно привязать к этим именам плейлистов песни из jos_musicbox_pls по условию
    PHP код:
    WHERE userid=$userid AND playlist='$result[playlistname]' 
    Вот и нашел решение в формировании запроса в цикле.

  10. #10
    Активист izori Странник Аватар для izori

    Регистрация
    01.11.2008
    Сообщений
    550
    Сказал(а) спасибо
    5
    Поблагодарили 4 раз(а) в 3 сообщениях

    По умолчанию

    Цитата Сообщение от freeman Посмотреть сообщение
    Мега супер индусский говнокод для выборки данных из одной таблицы в цикле )))

    Достаточно одной таблэтки:

    SELECT * FROM jos_musicbox_pls WHERE playlist IN
    (SELECT DISTINCT playlist FROM jos_musicbox_pls WHERE userid=$userid)

    Там точно работа идёт с одной и той же таблицей jos_musicbox_pls в обоих запросах? Ибо всё может быть ещё проще
    ыыыыыы зарисовался ))) спасибо Wolfshadow написал то что хотел я запрос с join'ом

    а как ЗЫ скажу то что написал МикиМаус = дилитанство а вот говнокод начинается с select from select или ... where field in (select ) такими запросами убиваются любые серваки БД

+ Ответить в теме

Похожие темы

Метки этой темы

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
Херсонский ТОП   Рейтинг@Mail.ru МЕТА - Украина. Рейтинг сайтов

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112