[sql] Вопросы по БД

Discussion in 'PHP' started by FraiDex, 25 Feb 2008.

Thread Status:
Not open for further replies.
  1. FindeR

    FindeR Elder - Старейшина

    Joined:
    15 Nov 2006
    Messages:
    623
    Likes Received:
    138
    Reputations:
    20
    Так может
    Code:
    
    $result = mysql_query("SELECT subcatid, title, description FROM baza_ads WHERE subcatid in (5,8)") or die(mysql_error());
    
    
    А потом уже
    Code:
    while ($row = mysql_fetch_assoc($result))
    {
    echo $row['subcatid'] . ': <br />';
    echo 'title:'.$row['title'] . '<br />';
    echo 'description:'.$row['description'] . '<br />';
    
    }
    
    
     
    #1221 FindeR, 21 Sep 2010
    Last edited: 21 Sep 2010
    1 person likes this.
  2. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Спасибо. работает. Я просто привел этот пример так как хотел понять как сделать в моей ситуации.. оказалось все на много сложней :(

    Прочитай пм
     
  3. Adio

    Adio Elder - Старейшина

    Joined:
    23 May 2005
    Messages:
    1,646
    Likes Received:
    148
    Reputations:
    18
    Хотел спросить еще одну вещь. Что такое

    Code:
    SELECT a.*,
    
    Что вот это ( а. ) с точкой обозначает ? выбрать откуда ?
     
  4. FindeR

    FindeR Elder - Старейшина

    Joined:
    15 Nov 2006
    Messages:
    623
    Likes Received:
    138
    Reputations:
    20
    a. - префикс, он любым может быть. Его используешь, если нужно в пределах запроса работать с уже полученными данными.
     
  5. krypt3r

    krypt3r Elder - Старейшина

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    имя таблицы или ее алиас, если в запросе используется несколько таблиц, типа
    Code:
    SELECT a.id, b.id, c.summa
    FROM customers a
    INNER JOIN users b ON a.user_id = b.id
    INNER JOIN orders c ON a.user_id = c.user_id
    
     
  6. Irdis

    Irdis Elder - Старейшина

    Joined:
    6 Feb 2006
    Messages:
    248
    Likes Received:
    52
    Reputations:
    3
    как реализовать отношение
    1..0 к 1..0
    mssql
    ==========update============
    вот что народ отвечает на винграде
    http://forum.vingrad.ru/forum/topic-310904.html
     
    #1226 Irdis, 26 Sep 2010
    Last edited: 27 Sep 2010
  7. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    есть софт для сбора статы с игрового сервера Ил2
    база mysql скрипты сайта статы пхп

    так вот там система такая
    записывается каждый вылет игрока, сколько сбил, сколько уничтожил и т.д.
    на главной сайта выводится например топ 10, 20 или 30
    так же есть страницы со списком пилотов с сортировкой, и профиль каждого пилота

    пока статистика свежо установленная - все ок
    как только проходит 1-2 месяца, сайт статы начинает тормозить

    у многих игроков получается уже по 1000 вылетов, и каждый раз при открытие главной , страницы пилотов и т.д. для каждого пилота считается и суммируется все его вылеты, коэффициенты и т.д.

    наверно лучше бы это все было считать при вводе данных и иметь "статичную" таблицу общей статы, но как есть

    может есть какие то рекомендации по настройки mysql в таких ситуациях?

    и подходит ли mysql для таких систем, т.е. для статистики игрового сервера? или есть более подходящие бд?
     
  8. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Vaal mysql - вполне достаточно для этого
    1) не насилуйте БД, достаточно обновлять статистику раз в N минут.
    2) проверьте, стоят ли индексы на столбцах, по которым идет группировка и/или поиск
    3) посмотрите как ведут себя запросы, с помощью запроса "EXPLAIN исходный запрос"
     
    _________________________
  9. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    1) исходников софта нет т.е. изменить систему ввода данных не получится, так бы я её обновлял только после окончания миссии т.е. примерно 1 раз в час
    2) индексы проверил, стоят
    3) запрос списка пилотов, с EXPLAIN до этого не сталкивался
    Code:
    id     select_type     table     type     possible_keys     key     key_len     ref     rows     Extra
    1     SIMPLE     s     ALL     NULL     NULL     NULL     NULL     55259     Using where; Using temporary; Using filesort
    1     SIMPLE     p     eq_ref     PRIMARY     PRIMARY     4     il2sc.s.pilotid     1      
    т.е. получается так что когда нужно вывести список больше чем из одного пилота, выбираются все пилоты и все вылеты(сейчас 55259), это набежало за 2 недели
     
  10. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Vaal похоже-таки не стоят. Покажите запрос и структуру таблиц (SHOW CREATE TABLE `имя_таблицы`)
     
    _________________________
  11. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    http://dumpz.org/22587/
    http://dumpz.org/22588/
     
  12. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Vaal если этот запрос нельзя менять - то разумно исправить ситуацию не получится. Имхо
     
    _________________________
  13. e-gral

    e-gral Banned

    Joined:
    4 Mar 2008
    Messages:
    18
    Likes Received:
    0
    Reputations:
    0
    зачем AP в запрoсе?
    к примеру:
    db_query('UPDATE table1 SET var1='.AP.$var1.AP.',var2='.AP.$var2.AP.' WHERE var3='.AP.$var3.AP.'LIMIT 1;');
     
  14. triger

    triger New Member

    Joined:
    7 Aug 2010
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    как в linux"е подключить или включить консоль mysql
    в конце концов эта же функция есть, или я что то путаю?
     
  15. b3

    b3 Banned

    Joined:
    5 Dec 2004
    Messages:
    2,174
    Likes Received:
    1,157
    Reputations:
    202
    В консоли пишеш mysql -u root -p[ENTER] потом пароль пользователя mysql и вот тебе консоль.
     
  16. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    запрос менять можно, есть способ его оптимизировать?

    ради интереса поставил Firebird
    конвертировал базу в него из Mysql
    сделал запрос выдающий результат аналогичный Mysql
    http://dumpz.org/22643/

    получилось вот так
    Firebird - Execute time = 828ms
    Mysql - Запрос занял 1.2912 сек
    но как уже говорил это база пока 2х недельная, тормоза появляются через месяц или полтора
     
  17. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Vaal 0.8 мс - это нереально много. Создайте таблицу с теми же типами полей, которые выбираете этим запросом, и соответственно выбирайте данные из нее. Создайте скрипт, запускаемый по крону каждые 5 минут с таким запросом:
    Code:
    INSERT INTO new_table(поля, поля, поля...) SELECT
                p.id AS id,
                p.streak as streak,
                p.maxstreak as maxstreak,
                p.callsign AS name,
    
    
                sum(s.eAir) as ks,
                sum(s.fAir) as fair,
                sum(s.eSair+s.eTank+s.eWag+s.eArt+s.eCar+s.eAaa+s.eShip) as ground,
    
                count(*) as sorties,
                sum(s.eAir) / (sum(if(s.SortieEND='DIED' or s.SortieEND='BAIL' or s.SortieEND='MIA' or s.SortieEND='CAPTURED' or s.SortieEND='DIEDISCO',1,0))+1)  as kd,
                sum(s.eSAir+s.eTank+s.eCar+s.eArt+s.eAaa+s.eWag+s.eShip) / (sum(if(s.SortieEND='DIED' or s.SortieEND='BAIL' or s.SortieEND='MIA' or s.SortieEND='CAPTURED' or s.SortieEND='DIEDISCO',1,0))+1) as gkd,
                sum(if(s.SortieEND='DIED' or s.SortieEND='MIA' or s.SortieEND='CAPTURED' or s.SortieEND='DIEDISCO',1,0))+0 as died,
    
                sum(s.eAir) / count(*)  as ksort,
                round(sum((UNIX_TIMESTAMP(s.endtime)-UNIX_TIMESTAMP(s.starttime)))/3600,2)+0 as ftime,
                sum(s.eAir) / (round(sum((UNIX_TIMESTAMP(s.endtime)-UNIX_TIMESTAMP(s.starttime)))/3600,2)+1)+0  as khr,
    
      sum(s.eAir-s.eBom)*2 + sum(s.eBom)*4 + sum(s.eSAir)*0.2 + sum(s.eShip) + sum(s.eTank)*0.4 + sum(s.eAaa)*0.6 + sum(s.eWag)*0.2 + sum(s.eArt)*0.3 + sum(s.eCar)*0.15 - (round(sum((UNIX_TIMESTAMP(s.endtime)-UNIX_TIMESTAMP(s.starttime)))/3600,2)+0) - sum(if(s.SortieEND='DIED' or s.SortieEND='MIA',1,0))*2 - sum(if(s.SortieEND='CAPTURED',1,0))*1.5 - sum(if(s.SortieEND='CRASHED',1,0))*0.5 - sum(if(s.SortieEND='BAIL',1,0))+1      as score
    
            FROM
                pilots as p,
                sorties as s
            WHERE
               s.pilotid=p.id
               and
                s.SortieEND != 'KICK'
            GROUP BY p.id
            ORDER BY score DESC
            LIMIT 0, 50;
    Нагрузка упадет на несколько порядков, это если решать по простому. Если по сложому - сидеть и оптимизировать запрос (хотя чую, что это слабо возможно), но тут я не советчик
     
    _________________________
  18. Vaal

    Vaal New Member

    Joined:
    8 Jan 2010
    Messages:
    37
    Likes Received:
    2
    Reputations:
    0
    Спасибо за совет, наверно так и сделаю, со второй таблицей.
     
  19. maximka77

    maximka77 New Member

    Joined:
    7 Apr 2010
    Messages:
    5
    Likes Received:
    0
    Reputations:
    0
    Вопрос по контакту,как записывать в бд id пользователей которые установили приложение?
    Я в этом новичок,поэтому жду помощи.
     
  20. amf1

    amf1 New Member

    Joined:
    15 Jun 2010
    Messages:
    3
    Likes Received:
    0
    Reputations:
    0
    народ. 4асто попадаются базы, где вместо данных к примеру кредиток пишется NULL
    то есть они не сохраняются. как вклю4ить 4тоб они сохранялись?
     
Thread Status:
Not open for further replies.