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

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

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

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

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Code:
    UPDATE xxx, yyy SET yyy.count=(yyy.count-1) WHERE yyy.name=xxx.name AND xxx.id=5;
    DELETE FROM xxx WHERE id=5;
     
    #641 FireFenix, 6 Jun 2009
    Last edited: 6 Jun 2009
    1 person likes this.
  2. Vanofuture

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

    Joined:
    24 Apr 2008
    Messages:
    34
    Likes Received:
    10
    Reputations:
    0
    FireFenix, спс всё пашет. В продолжение темы:
    Нужно извлечь записи из таблицы xxx, при этом если в таблице yyy есть запись у которой поле xxx.`id`=`yyy`.`cur_id` то эти данные также должны появится в результате, а если их нету то запрос все равно будет выполнен. Я пытался сделать что-то вроде, но не получилось:
    Code:
    SELECT * FROM `xxx` IF EXISTS(SELECT * FROM `yyy` WHERE `xxx`.`id`=`yyy`.`my_id`);
     
  3. FireFenix

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

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Как всегда всё запутанно и сложно :)
    На этот случай есть LEFT JOIN

    Code:
    SELECT * FROM xxx LEFT JOIN yyy ON yyy.my_id=xxx.id
    Тогда ты получишь таблицу - состоящую из столбцов 2х таблиц

    Для наглядности и понимания советую посмотреть - http://www.codinghorror.com/blog/archives/000976.html
     
  4. [R]eD

    [R]eD Elder - Старейшина

    Joined:
    1 Aug 2006
    Messages:
    72
    Likes Received:
    1
    Reputations:
    0
    Есть таблица с колонкой date (тип varchar), в ней содержится timestamp, как вывести например записи с датой 2009-01-04?
    Спасибо.
     
  5. FireFenix

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

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Code:
    SELECT FROM_UNIXTIME(data_field);
    Code:
    mysql> SELECT FROM_UNIXTIME(1196440219);
            -> '2007-11-30 10:30:19'
    
    mysql> SELECT FROM_UNIXTIME(1196440219) + 0;
            -> 20071130103019.000000
    
    mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(), '%Y %D %M %h:%i:%s %x');
            -> '2007 30th November 10:30:59 2007'
    
    Code:
    SELECT * FROM table WHERE FROM_UNIXTIME(data_field) = '2009-01-04';
     
    #645 FireFenix, 10 Jun 2009
    Last edited: 10 Jun 2009
  6. krypt3r

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

    Joined:
    27 Apr 2007
    Messages:
    1,507
    Likes Received:
    389
    Reputations:
    101
    Code:
    select * from mytable where date(`date`) = '2009-01-04';
    
     
  7. FireFenix

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

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Code:
    $query = mysql_query("SELECT * FROM news ORDER BY id DESC");
    ASC - обычный порядок
    DESC - обратный порядок
     
    1 person likes this.
  8. Vanofuture

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

    Joined:
    24 Apr 2008
    Messages:
    34
    Likes Received:
    10
    Reputations:
    0
    Как для каждой записи в таблице xxx создать запись в таблице yyy?
     
  9. FireFenix

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

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    Code:
    INSERT INTO yyy (name, id_xxx) SELECT "Я название" as "name", id FROM xxx;
    Code:
    SELECT * FROM xxx;
    ... Получаем нужные данные...
    INSERT INTO yyy SET столбец="полученные данные";
    Вообще нужно уточнить задачу. Там есть много способов.
     
  10. Vanofuture

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

    Joined:
    24 Apr 2008
    Messages:
    34
    Likes Received:
    10
    Reputations:
    0
    Даже не знаю, что там может быть особенного.
    Нужно для каждой записи из таблицы xxx создать запись в таблице yyy, при это надо заменить часть дефолтного текста одним полем из xxx. Мой набросок:
    Code:
    SELECT `name` FROM `xxx`;
    INSERT INTO yyy VALUES(NULL, ( REPLACE(somedata, '%username%', `xxx`.`name`) ) );
     
    1 person likes this.
  11. FireFenix

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

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    INSERT INTO yyy (name, id_xxx) SELECT "Я название" as "name", id FROM xxx;
    вот используй

    в SELECT указываешь поля которые будут выбираться из ххх и измённое поле как "поле as имя_поля"
     
  12. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    Немного не понял некоторых вещей:
    0. Это все необходимо сделать на уровне MySQL? Если же в PHP, то могу подсказать.
    1. Для каждой записи в xxx надо сделать запись в yyy, но что и чем надо заменить?
     
  13. Vanofuture

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

    Joined:
    24 Apr 2008
    Messages:
    34
    Likes Received:
    10
    Reputations:
    0
    0. Да, и что-то я сильно туплю с этим.
    1. Замена неозятельна.
    Чтобы было понятней скажу что пишу систему массовой рассылки ЛС, в ней нужно для каждого пользователя создать запись в таблице `pm` с заданым текстом и при внесении это в бд дать записи id юзера.
    Попробую решить задачу проверенным способом — перепотрошить какой-то готовый двиг и посмотреть как сделано там.
     
  14. FireFenix

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

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
    INSERT messages (text, id_user) SELECT "текст рассылки" as "text", id FROM users

    Либо в 2 запроса
     
    #654 FireFenix, 12 Jun 2009
    Last edited: 12 Jun 2009
  15. REBUUS

    REBUUS Active Member

    Joined:
    6 Apr 2009
    Messages:
    314
    Likes Received:
    111
    Reputations:
    9
    есть таблица t1 на сервере S1 и точна такая же таблица t2 у меня на локалхосте S2
    мне надо периодический переносить новые записи которые появляются на в таблице t1 к себе на локалхост в таблицу t2, т.е организовать синхронизация , таблица на локалхосте t2 сам не меняется только при синхронизации добавляються новые записи из t1.
    А теперь внимание вопрос))) как мне это грамотно организовать, что бы быстро все делалось. как ни будь я сам могу сделать, но не нужно грамотно организовать это :)
     
  16. FireFenix

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

    Joined:
    3 Jun 2009
    Messages:
    390
    Likes Received:
    115
    Reputations:
    23
  17. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    Если есть непосредственный коннект к серверам баз данных - организуется репликация (мастер-слейв)
    если нет - то через, например, пхп-скрипт, который запускается по времени или вручную
     
  18. KaZ@NoVa

    KaZ@NoVa Elder - Старейшина

    Joined:
    5 Jul 2008
    Messages:
    368
    Likes Received:
    438
    Reputations:
    -16
    Я привык к тому, что доступа к удаленному MySQL нету, следовательно либо использовать тулзы для PHP tunneling, либо делается скрипт синхронизации. Суть такова - серверный скрипт при коннекте проверяет подлинность клиента и в случае подтверждения обрабатывает параметры запроса, проверяет изменившиеся данные, генерирует выдачу и возвращает её. Проверка идет таким образом: вначале на S1 пропускается SELECT `какой-то-id` FROM `t1`; и если mysql_num_rows соответствует присланному количеству строк, то возвращаем ответ, что различий нет. Далее mysql_free_result (можно её и не вызывать, если записей немного) и читаем из запроса список уникальных ключей (например, если есть ID с auto_increment, то их список лучше всего), а затем делаем выборку всех полей в том порядке, в котором они идут в таблице:
    Ну и потом, соответственно, выдача этого результата в ответ.

    Клиентская часть должна через cURL (либо другим способом) забирать результат и, если он не пустой (т.е. изменений нет), выполнять его. То есть при запуске скрипта, он делает выборку уникальных полей и в запрос пишет количество записей в таблице t2 и список уникальных полей, а после забирает то, что возвращает сервер, и выполняет запрос. Еще желательно разбить запрос, например, explode (";\r\n",$response); и выполнять по отдельности, чтобы, в случае необходимости, знать, какая строка ошибку генерирует.

    Вот и всё!!!!!!! :(
     
  19. Велемир

    Joined:
    19 Jun 2006
    Messages:
    1,123
    Likes Received:
    96
    Reputations:
    -25
    Вопрос: Почему при выполнении команды show status значения переменных opened_tables и open_tables после совершения запросов через phpmyadmin остаётся неизменным?А также почему Com_show_status содержит 1 после туевой кучи выполнения оной?!
     
    #659 Велемир, 14 Jun 2009
    Last edited: 14 Jun 2009
  20. Велемир

    Joined:
    19 Jun 2006
    Messages:
    1,123
    Likes Received:
    96
    Reputations:
    -25
    Есть две директивы: Threads_connected и Threads_running.Можно ли по ним определить количество юзеров,подконнектившихся к базе ?
     
Thread Status:
Not open for further replies.