За последние 24 часа нас посетили 72865 программистов и 1648 роботов. Сейчас ищут 912 программистов ...

SQL запрос

Тема в разделе "PHP для новичков", создана пользователем wir_wolf, 3 апр 2010.

  1. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    Есть пример xml ки и есть база данных mySQL.
    Вот сам пример
    Код (Text):
    1. <root path="bid_image" thumbnailpath="small_image" >
    2. <fo p="111" d="28" m="12" y="2009">
    3. <fi p="P5160002.jpg" />
    4. <fi p="P5160005.jpg" />
    5. <fi p="P5210009.jpg" />
    6. <fi p="P5210010.jpg" />
    7. <fi p="P5210013.jpg" />
    8.   </fo>
    9.   </root>
    а вот так выглядит бд
    [​IMG]
    coment = "111" = имя альбома.
    Как написать такой SQL запрос, который бы выводил такого типа вещи.[/code]
     
  2. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
  3. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    Содержательный ответ. Да знаю мысль свою высловил очень плохо.. Но все же..
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну распиши подробнее: что есть, что хочешь, что умеешь и знаешь из этого. Тут сложного ничего. Просто не понятно чего ты хочешь, и чего ты в этом не понимаешь.
     
  5. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    что то типу

    require_once("db.php");
    $db = new db_layer();
    $db->getConnection();

    $qry = "ТУТ КАКО ТО ЗАПРОС СПЕЦЫФИЧЕСКИЙ'";
    $db->execute_sql($qry,$result,$error_msg);
    if($error_msg <> "")
    {
    echo $error_msg;die;
    }
    else
    {$db->execute_sql($qry,$result,$error_msg);}


    while($curs_row = mysql_fetch_object($result))
    {
    echo '<root path="bid_image" thumbnailpath="small_image" >
    <fo p="'.$curs_row->coment.'" тут каким то образом вывести дату в виде(d="28" m="12" y="2009")>
    <fi p="'.$curs_row->url.'" />
    </fo>
    </root>';
    }


    Ну а если альбомов будет много с каждым новым альбомом повторять
    <fo p="'.$curs_row->coment.'" тут каким то образом вывести дату в виде(d="28" m="12" y="2009")>
    <fi p="'.$curs_row->url.'" />
    </fo>

    примерно так
     
  6. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    нет. ты сформулируй, что ты хочешь получить в итоге. =) Тогда и будет понятно, что ты хочешь увидеть под "запрос спецыфический"

    Что ты хочешь получить в результате? Значения полей? Каких? При каких условиях? Какие отбросить? Какие выбрать?
     
  7. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    хорошо..
    При таблице
    [​IMG]
    <root path="bid_image" thumbnailpath="small_image" >
    <fo p="albums_1" d="01" m="04" y="2010">
    <fi p="PB150003.JPG" />
    <fi p="PB180011.JPG" />
    <fi p="PB180030.JPG" />
    </fo>
    </root>
    А при таблице
    [​IMG]
    <root path="bid_image" thumbnailpath="small_image" >
    <fo p="albums_1" d="01" m="04" y="2010">
    <fi p="PB150003.JPG" />
    <fi p="PB180011.JPG" />
    </fo>
    <fo p="albums_2" d="01" m="04" y="2010">
    <fi p="PB180030.JPG" />
    </fo>
    </root>
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ну ок. По-человечески это звучит так: "я хочу выбрать сначала фотки из одного альбома. А потом из другого" :D

    Я не буду писать запросы, но сформулирую их тебе на русском. думаю не составит труда переписать на мускульный язык.
    Вобще, такой подход, мне кажется, тебе поможет и в дальнейшем.

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

    Во-вторых, если ты хочешь выбрать данные по альбомам, то есть два подхода. Первый - это то, чем ты мучаешься - написать такой запрос, чтобы выдал все сразу и так как надо. Второй, по-проще - сначала спросить у базы, какие вобще есть альбомы. Т.е. сначала я бы тебе рекомендовал сделать один запрос - SELECT DISTINCT из столбика по альбомам. Он вернет тебе список альбомов, без повторений. Т.е. будет конкретно: альбом1 и альбом2. Заносишь это в массив, ну например $albums. Результат первого этапа будет выглядеть так: $albums[0]='albums_1' и $albums[1]='albums_2'.

    После, ты в цикле спрашивает у БД, мол, покажи мне url всех строк в которых coment = albums_1, и т.п.
    Примерно так:
    foreach ($albums as $album) {
    echo '<fo p="'.$album.'">';
    1) тут запрос к БД такой: "SELECT url FROM твоя таблица WHERE coment='$album'"
    2) вот и распотрониваешь результат тут в цикле.
    echo '<fi p="'.$row['url'].'" />';

    А в конце - echo '</fo>';
    }

    Готово.

    Но. Ты непраильно спроектировал это все дело, и поэтому у тебя будут сложности например с определением даты альбома. Если конечно не принять во внимание такое условие, чтобы все фотки в альбом добавлялись сразу в один день. Можно конечно брать младшую дату фотки, но если фотки потрут - младшая дата тоже может съехать. Пример: чел создал альбом в сентябре, накидал фоток. Потом в ноябре уже докинул еще фоток, а сентябрьские потер. Тогда ему будет писаться, что альбом создан в ноябре. И он будет злиться.


    Делать надо так:
    Первая таблица - список альбомов.
    1. id
    2. Дата создания.
    3. Название альбома.
    4. - по желанию - дата последнего изменения в альбоме. Там... Добавилась новая фотка - обновили эту дату.

    Вторая таблица - список фоток:
    1. id
    2. дата создания.
    3. id альбома, к которому приписана фотка. id из первой таблицы, значит.
    4. Ну дальше тут все, что пожелаешь. Имя фотки
    5. Коментарий к фотке.


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

    Панимай? =)
     
  9. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    А выбрать дату последней добавленной фотки в этот альбом - не? ;)
     
  10. Volt(220)

    Volt(220) Активный пользователь

    С нами с:
    11 июн 2009
    Сообщения:
    1.640
    Симпатии:
    1
    igordata
    Зачем делать много запросов когда достаточно одного?
     
  11. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Volt(220)
    Да что ты придираешься =)
    Он пока про джойны не знает, так что тс-с-с =))
     
  12. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    igordata
    Ну впринципе я так и думал делать
    так оно и есть....
    но, прабл в том как вывести дату по од дельности.
    в таблице он в виде 2010-04-01
    а в результате нужно получить такую запись.
    d="01" m="04" y="2010"

    Делаю админку для http://wir-wolf.org.ua/
     
  13. Apple

    Apple Активный пользователь

    С нами с:
    13 янв 2007
    Сообщения:
    4.984
    Симпатии:
    2
    Дак какого хрена она там в таком виде-то? =)
    Я лично храню даты в формате Unix Timestamp в поле Integer.
    Выборку делаю по этому полю, манипуляции наиудобнейшие, легко работать с функцией date в РНР, сортировка тоже нативная. Уж увы, не полюбились мне ни поля типа Date/Datetime, ни Timestamp.
     
  14. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    либо парсиь на пхп, либо, если дата в DATE хранится, то DAY(), MONTH(), YEAR() никто не отменял
    и вообще http://dev.mysql.com/doc/refman/5.1/en/ ... tions.html
     
  15. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    я - про джоины знаю. Развитие должно быть поступательным. Человек не может понять вобще, что в эти джоины джоинить, и откуда что выбирать. =) Джоины, я чую, будут уже в следующем топике =)
     
  16. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    Luge, чтот я с датой я не понял, куда ее совать то,дай какой нибудь пример, а дальше я розберусь\
    igordata, не через foreach ($albums as $album)



    PHP:
    1. <?php
    2. require_once("admin/db.php");
    3. $db = new db_layer();
    4. $db->getConnection();
    5.  
    6. header('Content-type: text/xml')
    7. echo '<root path="bid_image" thumbnailpath="small_image" >';
    8.  
    9.  
    10. $qry = "SELECT DISTINCT coment,date from albums ORDER BY date ASC";
    11. $db->execute_sql($qry,$result,$error_msg);     
    12.     if($error_msg <> "")
    13. {
    14.     echo $error_msg;die;
    15. }
    16. else
    17. {$db->execute_sql($qry,$result,$error_msg);}
    18.  
    19. while($row = mysql_fetch_object($result)){
    20.  
    21. echo '<fo p="'.$row->coment.'" d="28" m="12" y="2009">';
    22.  
    23.     $qry2 = "SELECT url from albums where coment='".$row->coment."'";
    24.     $db->execute_sql($qry2,$result2,$error_msg);       
    25.     if($error_msg <> "")
    26.     {
    27.         echo $error_msg;die;
    28.     }
    29.     else
    30.     {$db->execute_sql($qry2,$result2,$error_msg);}
    31.     while($row2 = mysql_fetch_object($result2)){
    32.         echo '<fi p="'.$row2->url.'" />';
    33.     }
    34.  
    35. echo '</fo>';
    36. }
    37. echo '</root>';
    38. ?>
     
  17. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    [sql]SELECT DAY(my_date) as `day`, MONTH(my_date) as `month`, YEAR(my_date) as `year` FROM `table` [/sql]
     
  18. wir_wolf

    wir_wolf Активный пользователь

    С нами с:
    10 янв 2009
    Сообщения:
    183
    Симпатии:
    0
    Luge
    Огромное спасибо)